2016-05-02 3 views
0

У меня возникла проблема с этой частью моего задания: Создайте карту, где ключ является типом животного, а значение - это список объектов CartoonCharacter, которые являются типом животное, хранящееся в в алфавитном порядке по названию. Распечатайте каждый ключ с карты и список объектов , которые ссылаются на ключевые слова. Я понимаю, как создать карту и что представляют собой ключи и значения, но у меня возникли проблемы с пониманием того, как я мог бы перебирать объекты и извлекать типы для использования в качестве ключей. возможно, используя метод put? вот код до сих порсоздать карту со строковым ключом и ссылкой на объект

public class CartoonDriver { 

public static void main(String[] args) { 

    //Construct objects of cartoon characters 
    CartoonCharacter BugsBunny = new CartoonCharacter("Bugs Bunny","rabbit",1990); 
    CartoonCharacter RogerRabbit = new CartoonCharacter("Roger Rabbit", "rabbit",1858); 
    CartoonCharacter MickeyMouse = new CartoonCharacter("Mickey Mouse", "mouse",1928); 
    CartoonCharacter MinnieMouse = new CartoonCharacter("Minnie mouse", "mouse",1930); 
    CartoonCharacter RoadRunner = new CartoonCharacter("Road Runner", "roadrunner",1986); 
    CartoonCharacter DaffyDuck = new CartoonCharacter("Daffy Duck", "duck",1999); 
    CartoonCharacter DonaldDuck = new CartoonCharacter("Donald Duck", "duck",1958); 
    CartoonCharacter ScoobyDoo = new CartoonCharacter("Scooby Doo", "dog",1975); 
    CartoonCharacter WinnieThePooh = new CartoonCharacter("Winnie The Pooh", "bear",1963); 
    CartoonCharacter Snoopy = new CartoonCharacter("Snoopy", "dog",1959); 


    //Create toons array list to add characters to 
    List<CartoonCharacter> toons = new ArrayList<CartoonCharacter>(); 

    //Add each characther to the array list 
    toons.add(BugsBunny); 
    toons.add(RogerRabbit); 
    toons.add(MickeyMouse); 
    toons.add(MinnieMouse); 
    toons.add(RoadRunner); 
    toons.add(DaffyDuck); 
    toons.add(DonaldDuck); 
    toons.add(ScoobyDoo); 
    toons.add(WinnieThePooh); 
    toons.add(Snoopy); 

    //print each object 
    for(CartoonCharacter toon : toons){ 
     System.out.println(toon); 
    } 

    //Create Map to hold type of toon and toon object as value 
    Map<String, CartoonCharacter> toonsMap = new HashMap<>(); 






} 

}

я устал пару вещей, но они не делают, так как с помощью метода пут, как и в toons.put (кролик, BugsBunny); , но это не кажется мне правильным для каждого объекта.

+0

Прочтите этот [учебник по Java] (https://docs.oracle.com/javase/tutorial/collections/interfaces/map.html) – randominstanceOfLivingThing

+0

Предполагая, что 'CartoonCharacter' имеет средство для получения типа, в котором вы могли бы использовать' toons. put (toon.getType(), toon) ', но помните, что вы не можете иметь несколько ключей, поэтому вам нужно будет использовать« Список », который содержит« CartoonCharacter »данного типа. Затем вы можете использовать «TreeMap», который будет заказывать ключи. Точка использования 'toon.getType' есть, вы можете просто пропустить свой существующий« Список »;) – MadProgrammer

ответ

2

Попробуйте это.

Map<String, List<CartoonCharacter>> map = toons.stream() 
    .collect(Collectors.groupingBy(CartoonCharacter::getType, Collectors.toList())); 

Я предположил, что класс CartoonCharacter имеет String getType() метод.

0

Вопрос заключается в том, что именно следует хранить на вашей карте: ключ - тип животного (строка, т.е. «кролик»), а значение - это лист персонажей мультфильмов этого типа животных. Простым способом является создание списка для каждого типа животных, а затем поместить соответствующий персонаж мультфильма в список, в который он входит. Затем вы можете создать свою карту с этими списками в качестве значений на вашей карте.

Мы не знаем код, лежащий за классом CartoonCharacter, но мы можем предположить, что, надеюсь, будет метод getType, getAnimalType или что-то подобное. Так вы можете получить тип животных для каждого персонажа.

Лучший способ, возможно, сделать это - это прорвать все ваши персонажи мультфильмов и получить их тип животных, используя метод, который мы предполагаем. Затем проверьте, содержит ли ваша карта ключ для этого типа животных. Если это не так, это означает, что это первое появление этого животного до сих пор, поэтому вы создали бы ключ и для значения, которое вы создали бы с одним элементом: текущим символом мультфильма. Если, однако, ключ существует, это означает, что все, что вам нужно сделать, это получить список для этого типа животных и добавить текущий символ мультфильма в существующий список.

0

Это не полный ответ, но я думаю, вы хотите использовать SortedMap, а не List. Ваше описание проблемы говорит, что вы хотите их в алфавитном порядке, предположительно по видам (второй параметр для конструктора CartoonCharacter).

Итак, вы хотите использовать класс, который реализует SortedMap, например TreeMap.

... TreeMap myMap = new TreeMap;

затем

Давайте добавим стандартные методы геттерные Ton ваш класс CartoonCharacter, а также метод получения ключа сортировки. Вы также должны предоставить метод toString или какой-либо другой метод, который получит хорошее печатное представление CartoonCharacter.

Class CartoonCharacter 
{ 
... 
public getName() { return name; } 
public getSpecies { return species; } 
public getBirthDate { return birthDate; } 
public getSortKey { String s = getSpecies(); return s.concat(getName()); } 
... 
} 

myMap.put (BugsBunny.getSortKey(), BugsBunny); ...

В конце вы можете использовать метод keySet() для получения итератора по ключам, а затем итерации через них.

Iterator iter = myMap.keySet().iterator(); 

в более старых версиях Java, вы бы использовать hasNext() и следующий() для перебора ключей. В современной Java, вы можете использовать для каждого цикла-:

for (CartoonCharacter ch: iter) 
{ 
    System.out.print(ch.toString(); 
} 

Я думаю, что что-то подобное будет получить, что вы хотите.

+0

ok Мне нравится. У меня есть все эти getter и сеттеры и хороший метод toString в классе, но я получаю флаг, который говорит, что для каждого из них нельзя использовать для типов итераторов? – Cake771

+0

Я вижу, что итератор имеет метод hasNext. Я попытаюсь использовать это в цикле while и посмотреть, работает ли это. и я запускаю java 8, так что это не старая версия – Cake771

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