要对Arraylist进行分配,我需要将1D数组更改为数组列表,这意味着将程序从listName.length修改为listName.size(),等等。
在将数组列表动物声明为类方法时遇到问题。我这样做是:animals.get(x) = new Dog(name, age);
,但是我收到一个错误,提示它左侧必须是变量。在new Cat(name, age);
和new Bird(name, age);
上发生相同的错误。
现在,我尝试创建一个String变量并分配给animals.get(x)
,然后将该变量分配给new Dog(name,age)
,这同样行不通,因为它希望我将new Dog(name, age)
更改为string (意思是将变量名更改为String string
,改成Dog string
),然后,我回到第一个方格,它要求我将变量改回String。
import java.util.ArrayList;
import java.util.Collection;
public class Database {
ArrayList<String> animals = new ArrayList<String>();
Database (int s) {
animals.size();
}//end of Database(s)
boolean addAnimal (int type, String name, int age) {
for (int x = 0; x < animals.size(); x++) {
if (animals.get(x) == null) {
if (type == 1) {
animals.get(x) = new Dog(name, age);
}//end of if
else if (type == 2) {
animals.get(x) = new Cat(name, age);
}//end of else if
else {
animals.get(x) = new Bird(name, age);
}//end of else
return true;
}//end of outer if
}//end of for loop
return false;
}//end of addAnimal(type, name, age)
Animal removeAnimal (String name) {
for (int x = 0; x < animals.size(); x++) {
if (animals.get(x).equals(null)) {
// If the spot in the array is null skip this index
}//end of if
else if (animals.get(x).equals(name)) {
String found = animals.get(x);
animals.at(x) = null;
System.out.print(found);
}//end of else if
}//end of for loop
return null;
}//end of removeAnimal(name)
}//end of class Database
由于我正在修改所有内容以适合数组列表,因此当用户选择添加动物时,我也必须修改上述方法。有三种动物,狗,猫和鸟,它们都有各自的类别。我m expecting the error'the left-hand side must be a variable' to disappear, and I
曾尝试寻找解决方法,但似乎找不到与我的问题类似的解决方案。
编辑更新
我包括了数据库类(具有方法addAnimal和removeAnimal的类)的完整代码。
答案 0 :(得分:4)
根据ArrayList(ArrayList)的Java文档,您应该使用“添加”功能,以便将新元素插入ArrayList,这意味着您的代码应如下所示:
boolean addAnimal (int type, String name, int age) {
for (int x = 0; x < animals.size(); x++) {
if (animals.get(x) == null) {
if (type == 1) {
animals.add(new Dog(name, age));
}//end of if
else if (type == 2) {
animals.add(new Cat(name, age));
}//end of else if
else {
animals.add(new Bird(name, age));
}//end of else
return true;
}//end of outer if
}//end of for loop
return false;
}//end of addAnimal(type, name, age)
注意:我假设当T是Animal的抽象类的接口时,变量“ animals”的类型为ArrayList。
希望我的问题没错,请问这是否不是您的意图。
编辑:
好吧,由于您的Dog和Cat类正在实现Animal接口,因此ArayList的类型应为:
ArrayList<Animal> animals = new ArrayList<Animal>();
代替:
ArrayList<String> animals = new ArrayList<String>();
现在,如果您只是想在不使用任何其他逻辑的情况下(例如删除重复项)将新对象添加到ArrayList,则只需要检查Object的类型并决定应该创建哪个类并添加ArrayList。然后,代码应如下所示:
boolean addAnimal (int type, String name, int age) {
switch(type){
case 1:
animals.add(new Dog(name, age));
return true;
case 2:
animals.add(new Cat(name, age));
return true;
default:
animals.add(new Bird(name, age));
return true;
}
return false;
}
另一个提示:我不知道您的总体任务,但是如果类型不是1或2则创建Bird可能不是一个好习惯,因为它基本上表示“如果动物不是狗或猫,它一定是鸟”,在大多数情况下,这不是很好的逻辑。因此,我的建议是也为Bird提供某种类型(例如3),如果该类型不是1、2或3,则可以警告该类型不存在或类似的东西。 因此,我将使用“默认”作为默认值:
boolean addAnimal (int type, String name, int age) {
switch(type){
case 1:
animals.add(new Dog(name, age));
return true;
case 2:
animals.add(new Cat(name, age));
return true;
case 3:
animals.add(new Bird(name, age));
return true;
default:
System.out.println("This type does not exists"); // Or some other operation
}
return false;
}
编辑2:
顺便说一句,由于“ add”可以在添加成功与否的情况下返回布尔值,因此代码可以更优雅:
boolean addAnimal (int type, String name, int age) {
switch(type){
case 1: return animals.add(new Dog(name, age));
case 2: return animals.add(new Cat(name, age));
case 3: return animals.add(new Bird(name, age));
default: System.out.println("This type does not exists"); // Or some other operation
}
return false;
}
答案 1 :(得分:4)
请注意,ArrayList的size方法不能像数组的长度那样工作:
new Object[10].length; // returns 10
List<Object> list = new ArrayList<>(10);
list.size(); // returns 0
list.addAll(Collections.nCopies(10, null));
list.size(); // returns 10
new ArrayList<>(Collections.nCopies(10, null)).size(); // returns 10
如您所见,ArrayList默认情况下不存储空值,相反,它们根本不存储任何内容。这意味着不需要遍历并查找null ...您只需将值添加到列表中即可。
boolean addAnimal(int type, String name, int age) {
if (type == 1) {
animals.add(new Dog(name, age));
}
else if (type == 2) {
animals.add(new Cat(name, age));
}
else {
animals.add(new Bird(name, age));
}
return true; // You can probably make this a void method now
}
P.S。我在评论中看到您的ArrayList类型为String ...您的动物不是字符串,因此您可以使用new Dog(name, age).toString()
将它们转换为字符串,或者我建议将ArrayList更改为常见类型(即ArrayList<Animal> animals
或ArrayList<Object> animals
)。
答案 2 :(得分:3)
“ =”将其右侧的值分配给其左侧的变量。在您的示例中,您想将对象分配给对象,而不是将对象分配给变量(animals.get(x)返回对象)。
编辑ArrayList元素的正确方法是set(int,Object)
(如@KrzysztofArłasik所述)。
在您的示例中:
boolean addAnimal (int type, String name, int age) {
for (int x = 0; x < animals.size(); x++) {
if (animals.get(x) == null) {
if (type == 1) {
animals.set(x,new Dog(name, age));
}//end of if
else if (type == 2) {
animals.set(x,new Cat(name, age));
}//end of else if
else {
animals.set(x,new Bird(name, age));
}//end of else
return true;
}//end of outer if
}//end of for loop
return false;
}//end of addAnimal(type, name, age)
答案 3 :(得分:1)