有没有办法让 Arraylist 元素等于类构造函数?
Posted
技术标签:
【中文标题】有没有办法让 Arraylist 元素等于类构造函数?【英文标题】:Is There a Way to Have an Arraylist Element Equal to a Class Constructor? 【发布时间】:2019-06-06 21:34:16 【问题描述】:对于 Arraylists 的赋值,我需要将一维数组更改为数组列表,这意味着将程序从 listName.length 修改为 listName.size() 等。
我在将我的数组列表动物声明为类方法时遇到问题。我这样做了:animals.get(x) = new Dog(name, age);
但我收到一个错误,它说左侧必须是一个变量。 new Cat(name, age);
和 new Bird(name, age);
上发生了同样的错误。
现在,我尝试创建一个字符串变量并分配给animals.get(x)
,然后将该变量分配给new Dog(name,age)
,这也不起作用,因为它希望我将new Dog(name, age)
更改为字符串(意思是更改我的变量名,比如说String string
,到Dog 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
ve 尝试寻找解决方法,但我似乎找不到与我的问题类似的解决方案。
编辑更新
我包含了我的 Database 类(具有 addAnimal 和 removeAnimal 方法的类)的完整代码。
【问题讨论】:
【参考方案1】:ArrayList
有方法set,你应该在你的情况下使用它。
例如:
animals.set(x, new Dog(name, age));
【讨论】:
我试过这个,但在“设置”时出现错误。错误显示:“ArrayList根据 ArrayList (ArrayList) 的 Java 文档,您应该使用“add”函数向 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 而没有任何其他逻辑(例如删除重复项),您只想检查对象的类型并决定应该创建什么类并添加 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;
【讨论】:
感谢您的建议。我已经尝试过了,但它强调了“添加”部分并提示我将其更改为我所做的“addAll ...()”。另一条红线出现在 addAll 下,程序提示我将参数 new Cat(name, age) 转换为 (Collection extends String>)。然后我看到一条黄线,然后它告诉添加@SuppressWarnings ... 是的,'animals' 的变量类型是 ArrayList"=" 将其右侧的值分配给其左侧的变量。在您的示例中,您想将对象分配给对象而不是对象分配给变量(animals.get(x) 返回对象)。
编辑 ArrayList 元素的正确方法是(如 @Krzysztof Arłasik 所述)方法 set(int,Object)
。
在你的例子中:
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)
【讨论】:
感谢您的建议。我刚才试过这个。但是,它在红色的“set”部分下划线,错误显示为:“ArrayListArrayList
被声明为ArrayList<String>
。例如,你应该创建抽象类或接口Animal
,你的动物类(狗、猫、鸟)应该扩展/实现Animal
,你的ArrayList
应该声明为ArrayList<Animal>
或者,如果您不想创建另一个抽象级别,您可以创建。 'ArrayList【参考方案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
如您所见,ArrayLists 默认不存储空值,而是根本不存储任何内容。这意味着不需要循环并查找空值...您可以简单地将值添加到列表中。
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
附:我在 cmets 中看到您的 ArrayList 是 String 类型...您的动物不是字符串,因此您可以使用 new Dog(name, age).toString()
将它们转换为字符串,或者我建议您将 ArrayList 更改为常见的类型(即ArrayList<Animal> animals
或ArrayList<Object> animals
)。
【讨论】:
哇,非常感谢!我修复了第二部分,但第一部分 '(new Object[10].length;...new ArrayList(Collections.nCopies(10, null)).size();)' 我有一个小问题.我将这部分包含在我的 removeAnimal 方法中,该方法返回 null。所以,当我运行程序并选择“捡起”动物时(方法 removeAnimal 就派上用场了),我输入了动物的名字,即使动物存在,程序也会打印出“动物/宠物”未找到 :(' else if (answer == 2) System.out.println("你的宠物叫什么名字?");名称 = input.next();动物 myPet = db.removeAnimal(name); if (myPet == null) System.out.println("Pet not found :("); //if结束 要按名称查找动物,您可以返回animals.stream().filter(a -> a.getName().equals(name)).findAny().orElse(null)
以上是关于有没有办法让 Arraylist 元素等于类构造函数?的主要内容,如果未能解决你的问题,请参考以下文章