2016-08-26 2 views
-4

У меня есть класс Animal, который распространяется подклассами Duck и Cow (и многие другие). Я делаю класс AnimalManager, который обрабатывает взаимодействия между моими животными и другими классами.Список Java, содержащий список различных подклассов

Я пытаюсь иметь список списков, которые содержат разные подклассы животных: List<List<differentSubclass> в классе AnimalManager.

Пример: список, который содержит список 100 Утки, список из 100 коров, список 50 горилл и т.д.

Каковы наилучшие возможные способы, чтобы создать этот список списков?

+1

Список списков является плохой подход, как вам нужно будет сделать контракт - индекс 0 - утки, индекс 1 - коровы вместо совпадения коров у «коров» – xenteros

+0

Как вы думаете, было бы лучше иметь отдельный класс менеджера для каждого подкласса Animal? Я полагаю, что если бы я это сделал, было бы немного дублированного кода. – user3603179

+0

@ user3603179 Я вообще не понимаю ваш вопрос. У вас может быть общий менеджер Animal и менеджер для тех животных, которым вы хотите переопределить некоторые взаимодействия общего определенного. –

ответ

-1

Если вы знаете ранее размер вашего списка списков, я рекомендую вам использовать простую таблицу. Тогда у вас будет больше эффективности и скорости, на которые @xenteros ответит. Это было бы что-то вроде:

private static final int DUCKS = 0; 
private static final int COWS = 1; 
private static final int GORILLAS = 2; 

private List<Animal>[] myAnimals = (List<Animal>[]) new List<?>[3]; // You know the size. 

List<Duck> ducks = new ArrayList<>(); 
List<Cow> cows = new ArrayList<>(); 
List<Gorilla> gorillas = new ArrayList<>(); 

myAnimals[DUCKS] = ducks; 
myAnimals[COWS] = cows; 
myAnimals[GORILLAS] = gorillas; 

Это решение является самым быстрым вы можете реализовать, но вы должны заботиться о ваших значений индекса для того, чтобы получить эту работу. Поскольку @xenteros сказал, что вы заключаете контракт, за которым вы должны следовать. Но с константами DUCK, COWS и GORILLAS это очень легко;)

Edit: лучший подход должен был бы использовать Enum в @Sergey Рыбалкин предлагает управлять типами животных, поэтому, если они растут высоко вверх и вы получаете как 400 видов животных, использование Enum было бы более гибким. Было бы что-то вроде:

private enum Animals { 
    DUCKS, 
    COWS, 
    GORILLAS; 
} 

private List<Animal>[] myAnimals = (List<Animal>[]) new List<?>[Animals.values().length]; // You can get the length of your enum. 

List<Duck> ducks = new ArrayList<>(); 
List<Cow> cows = new ArrayList<>(); 
List<Gorilla> gorillas = new ArrayList<>(); 

myAnimals[Animals.DUCKS.ordinal()] = ducks; 
myAnimals[Animals.COWS.ordinal()] = cows; 
myAnimals[Animals.GORILLAS.ordinal()] = gorillas; 

ordinal метод дает значение позиции, где было определено постоянное перечисление. В этом случае Animal.DUCKS.ordinal() дает 0, Animal.COWS.ordinal() дает 1 ... Больше информации в java doc

Возвращает порядковый номер этой константы перечисления (его положение в своем перечислений декларации, в которой начальная константа присваивается порядковый номер ноль).

+0

'HashMap' и' Array' имеют сложность доступа к данным. – xenteros

+0

@xenteros Для больших данных нет. «Hashmap» имеет ** среднее ** O (1), как вы сказали, и 'Array' всегда ** ** O (1) –

+1

Выполнение числа констант - это нонсенс. «Enum» - это хорошо. Более того, 'enum' имеет' length'. –

1

Использование map с соотношением class> Список животных class

Map<Class<? extends Animal>, List<? extends Animal>> map 

Это delclaration позволяет:

map.put(Duck.class, new ArrayList<Duck>()) 
+1

Я думаю, вы хотите сказать «Карта <Класс , List > map' –

+1

Определенно «Животное». Тем не менее подход одинаковый. –

Смежные вопросы