#java #data-structures
#java #структуры данных
Вопрос:
Допустим, у меня есть коллекция объектов, и для каждого объекта, который обладает определенным свойством, я хотел бы удалить этот объект и вставить новый объект на его место. В качестве примера допустим, у меня есть коллекция объектов animal:
[Собака, Дог, Дог, Койот, Дог, Лиса, Дог, Кошка, Хорек, сурок]
for each animal ->
if animal = Dog, Ferret, Groundhog continue iterating
else if animal = Coyote, replace with Dog and continue iterating
else if animal = Fox, replace with Dog and continue iterating
Какая структура данных была бы наилучшей для выполнения чего-то подобного при сохранении первоначального порядка коллекции? Приветствуются любые советы.
Комментарии:
1. обычный массив, размер которого удваивается всякий раз, когда нет свободного места
Ответ №1:
Массив — это самая легкая структура данных, которую вы можете использовать, и наиболее подходящая, если количество элементов не меняется. Единственная проблема заключается в том, что вы должны объявить ссылочный тип массива, чтобы все они были равны. Я бы предложил, чтобы все классы расширялись из родительского класса, скажем, ‘Animal’. В приведенном ниже решении я расширил все классы из Animal:
class Animal{
}
class Dog extends Animal{
}
class Cat extends Animal{
}
class Coyote extends Animal{
}
class Fox extends Animal{
}
class Ferret extends Animal{
}
class Groundhog extends Animal{
}
Затем я использовал массив для хранения экземпляров Animal.
Затем цикл for будет перебирать каждый элемент и заменять экземпляры Fox и Coyote на Dog.
public static void main(String[] args) {
Dog a = new Dog();
Dog b = new Dog();
Dog c = new Dog();
Coyote d = new Coyote();
Dog e = new Dog();
Fox f = new Fox();
Dog g = new Dog();
Cat h = new Cat();
Ferret i = new Ferret();
Groundhog j = new Groundhog();
Animal[] animalArray = new Animal[10];
animalArray[0] = a;
animalArray[1] = b;
animalArray[2] = c;
animalArray[3] = d;
animalArray[4] = e;
animalArray[5] = f;
animalArray[6] = g;
animalArray[7] = h;
animalArray[8] = i;
animalArray[9] = j;
for(int ii = 0; ii<animalArray.length; ii ){
if (animalArray[ii] instanceof Coyote || animalArray[ii] instanceof Fox){
animalArray[ii] = new Dog();
}
}
}
Если вы включите приведенный ниже код в общедоступный статический метод void main, вы можете запустить метод для получения следующего вывода.
for(Animal animal: animalArray){
System.out.println(animal.getClass());
}
Вывод (где ‘Test’ — это имя пакета):
class Test.Dog
class Test.Dog
class Test.Dog
class Test.Dog
class Test.Dog
class Test.Dog
class Test.Dog
class Test.Cat
class Test.Ferret
class Test.Groundhog
Комментарии:
1. Нет проблем, также проверьте ListIterator на Java, который может выполнять аналогичную работу со списками, когда вы не знаете точного количества элементов.