簡體   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