Есть ли способ сделать элемент Arraylist равным конструктору классов? - PullRequest
0 голосов
/ 12 января 2019

Для назначения в Arraylists мне необходимо изменить массив 1D в список массивов, что означает изменение программы с 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), и когда я это делаю, я возвращаюсь на круги своя, и он просит меня изменить мою переменную обратно на 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 пытался найти способы исправить это, но я не могу найти решение, подобное моей проблеме.

РЕДАКТИРОВАТЬ ОБНОВЛЕНИЕ

Я включил полный код для своего класса Database (класса, который имеет методы addAnimal и removeAnimal).

Ответы [ 4 ]

0 голосов
/ 12 января 2019

Здесь следует быть осторожным, метод размера ArrayList не работает как длина массива:

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
}

P.S. Я видел в комментариях, что ваш ArrayList имеет тип String ... Ваши животные не являются строками, поэтому вы можете либо преобразовать их в строки, используя new Dog(name, age).toString(), либо я рекомендую изменить ваш ArrayList на обычный тип (т. е. ArrayList<Animal> animals или ArrayList<Object> animals).

0 голосов
/ 12 января 2019

Согласно документации Java для ArrayList ( ArrayList ), вы должны использовать функцию «добавить», чтобы вставить новый элемент в 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)

Примечание: я предполагаю, что тип переменной "animals" - ArrayList, когда T - интерфейс абстрактного класса Animal.

Надеюсь, я правильно понял вопрос, дайте мне знать, если это не было вашим намерением.

EDIT:

Ну, так как ваши классы 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 определенный тип (например, 3), и если тип не 1, 2 или 3, вы можете предупредить, что тип не существует или что-то в этом роде. Так что я бы использовал "default" по умолчанию:

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;
}
0 голосов
/ 12 января 2019

"=" присваивает значение справа от переменной слева. в вашем примере вы хотите присвоить объект объекту, а не объект переменной (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)
0 голосов
/ 12 января 2019

ArrayList имеет метод set , который следует использовать в вашем случае.

Например:

animals.set(x, new Dog(name, age)); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...