添加第二个动物,将动物数组列表重置为索引 0。所以它容纳了最后一个进入的动物。我还把UML设计放在下面,所以它可能更容易理解我正在尝试的内容。
public class Cage {
private int placeNr;
private ArrayList<Animal> animals = new ArrayList<Animal>();
public Cage(int place) {
this.placeNr = place;
}
public int getCageNr() {
return this.placeNr;
}
public void putAnimal(Animal animal) throws DuplicateNameException {
if(!duplicatedAnimal(animal.getName())) {
animals.add(animal);
}
}
}
在这一点上我很困惑。如何在位于 Cage 中的数组列表中添加一个动物类并将我的动物堆叠在其中。
private static void addAnimal() {
Animal newAnimal;
Cage cage;
try {
System.out.println("Name: ");
String name = sc.next();
System.out.println("Type: ");
String type = sc.next();
System.out.println("birthYear: ");
int birthYear = sc.nextInt();
System.out.println("Cage number: ");
int cageNumber = sc.nextInt();
cage = new Cage(cageNumber);
newAnimal = new Animal(name, type, birthYear);
cage.putAnimal(newAnimal);
} catch (DuplicateNameException dne) {
dne.getMessage();
} catch (InputMismatchException ime) {
System.out.println("Wrong input");
}
}
如果有人能把我推向正确的方向,那将是非常棒的,谢谢!
UML:在此处输入图像描述
每次调用 addAnimal 时,您都会创建一个新的 Cage 对象并将新动物添加到该 Cage 中。要将几只动物添加到同一个笼子里,addAnimal 方法不能是静态的,笼子需要是某个类的成员(动物饲养员?
像这样的东西
public class AnimalKeeper {
private Cage cage;
public Cage getCage() {
return cage;
}
public addAnimalToCage(Animal animal) {
//the same method as above minus the user input
//which needs to be done somewhere else
}
}
我尽力弄清楚你的确切意思,重构你的代码,像这样 smth
class DuplicateNameException extends Exception {
private String message;
public DuplicateNameException(String message){
this.message = message;
}
public String getMessage(){
return this.message;
}
}
class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Cage {
private int placeNr;
private ArrayList<Animal> animals = new ArrayList<Animal>();
public Cage(int place) {
this.placeNr = place;
}
public int getCageNr() {
return this.placeNr;
}
public void putAnimal(Animal animal) throws DuplicateNameException {
if(!duplicatedAnimal(animal.getName())) {
animals.add(animal);
} else {
throw new DuplicateNameException(animal.getName());
}
}
private boolean duplicatedAnimal(String name) {
for (Animal animal : animals)
if (animal.getName().equals(name))
return true;
return false;
}
public static void main(String[] args) {
Animal newAnimal;
Cage cage;
try {
cage = new Cage(1);
newAnimal = new Animal("Dog");
cage.putAnimal(newAnimal);
cage.putAnimal(new Animal("not dog"));
cage.putAnimal(new Animal("Dog"));
} catch (DuplicateNameException dne) {
System.out.println(dne.getMessage());
}
}
}
注意:使用此代码,您需要考虑动物名称以小写和大写的情况(在这种情况下equals
将返回false
(使用toLowerCase()
或toUpperCase()
将名称规范化为共同点
您可以采取的另一个选择是使用 HashMap 对象,此结构类型内置了消除重复功能,您必须覆盖 Animal
的 hashCode()
函数,以便map
知道如何散列每个对象,例如
@Override
public int hashCode() {
return this.name.hashCode()
}