有没有办法使Arraylist元素等于类构造函数?

时间:2019-01-11 23:32:03

标签: java class oop variables arraylist

要对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的类)的完整代码。

4 个答案:

答案 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> animalsArrayList<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)

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

例如:

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