首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用字符串键和对象引用值创建映射

使用字符串键和对象引用值创建映射
EN

Stack Overflow用户
提问于 2016-05-02 08:42:15
回答 3查看 1.7K关注 0票数 0

我在任务的这一部分遇到了问题:创建一个Map,其中键是一种动物类型,值是该动物类型的CartoonCharacter对象列表,按名称的字母顺序存储。打印映射中的每个键以及键引用的对象列表。我知道如何创建映射以及键和值所代表的内容,但我无法理解如何遍历对象并提取类型以用作键。也许使用put方法?以下是目前为止的代码

代码语言:javascript
复制
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(toons.put,BugsBunny)中那样使用put方法;但对我来说,不必为每个对象都这样做似乎是正确的

EN

回答 3

Stack Overflow用户

发布于 2016-05-02 08:53:00

尝尝这个。

代码语言:javascript
复制
Map<String, List<CartoonCharacter>> map = toons.stream()
    .collect(Collectors.groupingBy(CartoonCharacter::getType, Collectors.toList()));

我假设CartoonCharacter类有String getType()方法。

票数 2
EN

Stack Overflow用户

发布于 2016-05-02 08:58:24

这个问题确切地说明了你应该在你的map中存储什么: key是动物的类型(一个字符串,即“兔子”),值是该动物类型的卡通人物列表。一种简单的方法是为每种动物创建一个列表,然后将相应的卡通人物放入它所属的列表中。然后,您可以创建地图,并将这些列表作为地图中的值。

我们不知道CartoonCharacter类背后的代码,但我们可以假设有一个叫做getType或getAnimalType的方法,或者类似的方法。这就是获取每个角色的动物类型的方法。

最好的方法可能是遍历所有的卡通人物,并使用我们假设存在的方法来获取它们的动物类型。然后检查您的地图是否包含该动物类型的关键字。如果没有,这意味着这是到目前为止该动物的第一次出现,因此您将创建一个键,并为该值创建一个包含一个元素的列表:当前卡通角色。但是,如果关键字存在,这意味着您需要做的就是获取该动物类型的列表,并将当前的卡通角色添加到现有列表中。

票数 0
EN

Stack Overflow用户

发布于 2016-05-02 09:22:39

这不是一个完整的答案,但我认为您应该使用SortedMap而不是列表。您对问题的描述表明您希望它们按字母顺序排列,大概按种类排列( CartoonCharacter构造函数的第二个参数)。

因此,您希望使用实现SortedMap的类,例如,TreeMap。

所以..。TreeMap myMap =新的TreeMap;

然后

让我们在您的CartoonCharacter类上添加标准的getter方法,以及一个获取排序关键字的方法。您还应该提供一个toString方法或其他一些方法,以获得CartoonCharacter的良好的可打印表示。

代码语言:javascript
复制
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()方法获取键的迭代器,然后遍历它们。

代码语言:javascript
复制
Iterator iter = myMap.keySet().iterator();

在旧版本的java中,您需要使用hasNext()和next()来遍历键。在现代java中,您可以使用for-each循环:

代码语言:javascript
复制
for (CartoonCharacter ch: iter)
{
    System.out.print(ch.toString();
}

我想像这样的东西会让你得到你想要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36973595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档