Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Estudando vetores

Olá pessoal. Estou com um exercício de programação que empaquei aqui e deve ser uma coisa bem simples. O trabalho é fazer uma biblioteca onde até agora tenho duas classes: Resource e Copy como objetos. Um resource no caso aqui seria um livro e podem ter até 9 copias

Fiz esse método para adicionar uma copia de um livro e realmente ele adiciona porem não para até ocupar todas as posições do vetor porque segue dentro do for. Tentei colocar um break mas também não era isso o que eu queria porque se adiciono duas copias de uma vez ele para.

private Copy[] copies = new Copy[9];

public void addCopy(String location) throws ResourceException {
        for (int i = 0; i < copies.length; i++) {
            if (copies[i] == null) {
                Copy copy = new Copy(location);
                copies[i] = copy;
            } else {
                throw new ResourceException("resource cannot have more than 9 copies!!");
            }
        }
    }
2 respostas

Oi Gabriel! Boa noite!

Não penso que a iteração sobre o array seja necessário para sua necessidade.

Recomendo algo muito mais simples, como guardar a quantidad de elementos que estão dentro do array para saber quantos ainda restam e a próxima posição livre.

package com.example.demo;

public class Teste {

    private Copy[] copies = new Copy[9];
    int copiesQtd = 0;

    public static void main(String[] args) {
        Teste teste = new Teste();
        try {
            teste.addCopy("location1.teste");
            teste.addCopy("location2.teste");
            teste.addCopy("location3.teste");
            teste.addCopy("location4.teste");
            teste.addCopy("location5.teste");
            teste.addCopy("location6.teste");
            teste.addCopy("location7.teste");
            teste.addCopy("location8.teste");
            teste.addCopy("location9.teste");
            //teste.addCopy("location10.teste");            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void addCopy(String location) throws ResourceException {
        if (copiesQtd >= 9) {
            throw new ResourceException("resource cannot have more than 9 copies!!");
        }
        copiesQtd++;
        copies[copiesQtd-1] = new Copy(location);
    }

    class Copy {

        private String location;

        public Copy(String location) {
            super();
            this.location = location;
        }

    }

    class ResourceException extends Exception {

        public ResourceException() {
            super();
        }

        public ResourceException(String message, Throwable cause, boolean enableSuppression,
                boolean writableStackTrace) {
            super(message, cause, enableSuppression, writableStackTrace);
        }

        public ResourceException(String message, Throwable cause) {
            super(message, cause);
        }

        public ResourceException(String message) {
            super(message);
        }

        public ResourceException(Throwable cause) {
            super(cause);
        }

    }
}

Espero ter ajudado,

Abraço e sucesso,

Rodrigo

solução!

Ola Rodrigo. Obrigado pela ajuda, realmente isso soluciona o problema porem tenho que seguir o UML do trabalho que me foi passado e não poderia criar essa variável "copiesQtd" fora do método.

Classe Resource:

  • -id:String = “0000000000”
  • -title:String = “Dummy”
  • -imageSrc:String = “./”
  • -price:double = 0.0
  • -yearPublished:int = 1900
  • -loanable:boolean = true

Metodos:

  • +Resource()
  • +Resource (id:String, title:String, imageSrc:String, price: double, yearPublished:int, genre:Genre, loanable:boolean, location:String)
  • +toggleLoanable():boolean
  • +existsCopy(number:int):boolean
  • +getCopies():Copy[]
  • +getCopy(number:int):Copy
  • +getNumCopies():int
  • +addCopy(location:String)
  • +removeCopy(number:int)
  • +removeCopies()
  • +getGenre():Genre
  • +setGenre(genre:Genre)
  • +getTotalCost():double
  • +toString():String //Setters e getters dos atributos dessa classe.

Classe Copy:

  • -number: int
  • -nextNumber: int = 1
  • -location: String = null

Metodos:

  • +Copy(resource:Resource)
  • +Copy(resource:Resource, location:String)
  • +getNumber():int
  • -setNumber()
  • +getNextNumber():int
  • -incNextNumber()
  • +getResource():Resource
  • +setResource(resource:Resource)
  • +getLocation():String
  • +setLocation(location:String)
  • +isACopyOfSameResource(copy:Copy):boolean
  • +isLoanable():boolean
  • +toString():String

Enfim se fosse o caso utilizaria um ArrayList de tamanho 9 porem o exercício pede um vetor normal.

Mas olhando agora você me deu uma ideia de chamar o método getNumCopies() para fazer a verificação.

Agora sim funcionou legal! Se tiver alguma dica para melhorar o código seria de grande ajuda mas imagino que não fiz nenhuma gambiarra.

public void addCopy(String location) throws ResourceException {

        boolean flag = false;

        for (int i = 0; i < copies.length; i++) {

            if (getNumCopies() >= 9) {
                throw new ResourceException("resource cannot have more than 9 copies!!");
            }

            if (copies[i] == null && flag == false && getNumCopies() <= 9) {
                Copy copy = new Copy(location);
                copies[i] = copy;
                flag = true;
            }            
        }        
    }