我在分配的这一部分时遇到了问题:创建一个地图,其中键是一种动物,值是一个列表 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<>();
}
}
我已经厌倦了几件事,但他们没有做,因为像使用put方法一样 toons.put(兔子,BugsBunny); 但对我而言,对每个对象来说,这似乎都是正确的
答案 0 :(得分:2)
试试这个。
Map<String, List<CartoonCharacter>> map = toons.stream()
.collect(Collectors.groupingBy(CartoonCharacter::getType, Collectors.toList()));
我认为类CartoonCharacter有String getType()
方法。
答案 1 :(得分:0)
问题确切地说明了你应该在地图中存储的内容:key是动物的类型(字符串即“兔子”),值是该类型动物的卡通人物的列表。一种简单的方法是为每种类型的动物创建一个列表,然后将相应的卡通人物放入其所属的列表中。然后,您可以创建地图,将这些列表作为地图中的值。
我们不知道CartoonCharacter类背后的代码,但是我们可以假设希望是一个名为getType,getAnimalType或类似的方法。这就是你如何获得每个角色的动物类型。
可能做到这一点的最好方法是循环遍历所有卡通人物,并使用我们假设存在的方法获取他们的动物类型。然后检查您的地图是否包含该动物类型的关键字。如果没有,则意味着它是迄今为止该动物的第一次出现,因此您将创建一个键,对于该值,您将创建一个包含一个元素的List:当前的卡通人物。但是,如果密钥存在,则表示您需要做的就是获取该动物类型的列表,并将当前卡通字符添加到现有列表中。
答案 2 :(得分:0)
这不是一个完整的答案,但我认为你想使用SortedMap而不是List。您对问题的描述表明您希望它们按字母顺序排列,可能是物种(CartoonCharacter构造函数的第二个参数)。
所以你想使用一个实现SortedMap的类,例如TreeMap。
...这样 TreeMap myMap = new TreeMap;
然后
让我们为您的CartoonCharacter类添加标准的getter方法,以及获取排序键的方法。您还应该提供一个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()和next()来遍历密钥。在现代java中,您可以使用for-each循环:
for (CartoonCharacter ch: iter)
{
System.out.print(ch.toString();
}
我认为这样的事情会让你得到你想要的东西。