Какая структура данных подходит для изменения некоторых элементов коллекции на месте?

#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, который может выполнять аналогичную работу со списками, когда вы не знаете точного количества элементов.