有没有办法让 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 Ive 尝试寻找解决方法,但我似乎找不到与我的问题类似的解决方案。

编辑更新

我包含了我的 Database 类(具有 addAnimal 和 removeAnimal 方法的类)的完整代码。

【问题讨论】:

【参考方案1】:

ArrayList 有方法set,你应该在你的情况下使用它。

例如:

animals.set(x, new Dog(name, age)); 

【讨论】:

我试过这个,但在“设置”时出现错误。错误显示:“ArrayList 类型中的方法 set(int, String) 不适用于参数 (int, Bird)”。不过感谢您的帮助(: 当然。但是对于什么课?动物课? (这个类只是创建变量:名字和年龄,并有它的getter 和setter) Launcher 类? (这个类有main方法) 数据库类? (这个类为动物创建数组列表,添加和删除动物(三种动物:狗、猫、鸟,每个都有自己的类,它们有方法为这些动物发出声音或做动作)) Atlasik 就像你说的,我已经编辑了我的问题,并包含了数据库类的其余代码,该类是添加和删除动物的类(可以在 main 方法中进行选择) 【参考方案2】:

根据 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 我已经包含了 Database 类的完整代码,该类添加和删除动物(可以在 main 方法中进行选择) 好吧,既然 Dog 和 Cat 都实现了接口 Animal,那么 ArrayList 的类型应该是 Animal: 'ArrayList animals = new ArrayList();'而不是:'ArrayList 动物 = new ArrayList();'另外,正如亚当在另一个答案中所说,您需要删除 for 循环,因为 ArrayList 在没有任何对象的情况下进行初始化,因此 size=0。【参考方案3】:

"=" 将其右侧的值分配给其左侧的变量。在您的示例中,您想将对象分配给对象而不是对象分配给变量(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”部分下划线,错误显示为:“ArrayList 类型中的方法 set(int, String) 不适用于参数 (int, Bird)” 我已经包含了我的数据库类的其余代码。它是添加和删除动物的类(这个选择可以在main方法中进行) 这是因为您的ArrayList 被声明为ArrayList&lt;String&gt;。例如,你应该创建抽象类或接口Animal,你的动物类(狗、猫、鸟)应该扩展/实现Animal,你的ArrayList应该声明为ArrayList&lt;Animal&gt; 或者,如果您不想创建另一个抽象级别,您可以创建。 '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&lt;Animal&gt; animalsArrayList&lt;Object&gt; 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 -&gt; a.getName().equals(name)).findAny().orElse(null)

以上是关于有没有办法让 Arraylist 元素等于类构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法让构造函数只对 C# 中的父类可见?

JAVA中构造方法和普通方法的区别

Arraylist交换元素[重复]

集合类

java中list和arraylist的区别

有没有办法让 CSS 边距通过字段集边界折叠?