繁体   English   中英

使用字符串键和对象引用值创建地图

[英]create map with string key and object reference value

我在我的作业的这一部分中遇到了麻烦:创建一个Map,其中的键是一种动物,而值是该动物的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(rabbit,BugsBunny)中那样使用put方法; 但这对我来说似乎不适合每个对象

尝试这个。

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

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

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

我们不知道CartoonCharacter类背后的代码,但是我们可以假设希望会有一个名为getType或getAnimalType或类似方法的方法。 这样便可以获取每个角色的动物类型。

最好的方法是遍历所有卡通人物,并使用我们认为存在的方法获取它们的动物类型。 然后检查您的地图是否包含该动物类型的密钥。 如果不是,则表示这是迄今为止该动物的首次出现,因此您将创建一个键,并为该值创建一个包含一个元素的列表:当前卡通人物。 但是,如果键存在,则意味着您需要做的就是获取该动物类型的列表,然后将当前卡通人物添加到现有列表中。

这不是一个完整的答案,但我认为您想使用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();
}

我认为类似这样的东西可以满足您的需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM