尝试使用 HashMap 通过另一个 Class 添加字符串数组

Trying to add Array of Strings via Another Class using HashMap

基本上我知道如何用 ArrayList 做到这一点,但要用 Array 做到这一点我完全被难住了。

import java.util.HashMap;
import java.util.Set;
import java.util.Iterator;
import java.util.Map;
import java.util.Collection;

public class NobelPrizeWinners
{
    private HashMap<String, PrizeWinners[]> winners;

    public NobelPrizeWinners()
    {
        winners = new HashMap<String, PrizeWinners[]>();

        PrizeWinners[] name = new PrizeWinners[3];
        name[0] = new PrizeWinners("hey" , "Hey");

        winners.put("2008", name);
    }
}
public void displayAllYearsAndWinners(){
    Set<String> years = winners.keySet();

            for(String year : years){
                PrizeWinners [] list = winners.get(year);
                for(PrizeWinners[] names : list){

               System.out.println(year + " " +   names); 
            }

         }

   }

这returns只有内存地址,不是实际的字符串(获奖者class在构造函数中有两个字符串参数,以及两个设置名字和姓氏的方法)

我觉得我很接近它 returns "2008" 三次,但只有内存地址或其他三次为空(因为我还没有添加其他 2 个数组,但仍在测试看看它是否有效)

任何帮助将不胜感激,我觉得它是我不确定的名称或我需要调用的方法。

第一个问题是循环应该是这样的:

for (String year: years) {
    PrizeWinners[] list = winners.get(year);
    for (PrizeWinners names: list) {
        System.out.println(year + " " + names);
    }
}

因为您已经将 list 作为数组检索,所以您的 for-each 循环 returns 每次迭代都是 PrizeWinners,而不是 另一个数组 .

这一行:

System.out.println(year + " " +   names); 

等同于:

System.out.println(year.toString() + " " +   names.toString()); 

因为 year 是一个 String,它的 toString() 方法只是 returns 它的值,正如预期的那样。

但是 names 是一个 Array。它的toString()方法直接继承自Object,打印names.

的内存地址

解决这个问题最干净的方法是覆盖 class PrizeWinners 中的 toString()。这让您可以自己决定 class 的 String 表示应该是什么。

public String toString() {
    return this.firstName + ", " + this.lastName;
}

现在,当在 PrizeWinnersnames 实例上调用隐式 toString() 时,您将获得预期的输出。

     for(String year : years){
        PrizeWinners [] list = winners.get(year);
        for(PrizeWinners winnerName: list){
              System.out.println(year + " " +   winnerName.firstName + " " + winnerName.lastName); 

        }

     }

您的 displayAllYearsAndWinners 方法中发生了一些奇怪的事情。可以简化为:

NobelPrizeWinners.java

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class NobelPrizeWinners {
  private Map<String, PrizeWinner[]> yearToWinners;

  public NobelPrizeWinners() {
    yearToWinners = new HashMap<String, PrizeWinner[]>();

    PrizeWinner[] winners2008 = new PrizeWinner[3];
    winners2008[0] = new PrizeWinner("hey", "Hey");
    yearToWinners.put("2008", winners2008);
  }

  public void displayAllYearsAndWinners() {
    for (Map.Entry<String, PrizeWinner[]> entry : yearToWinners.entrySet()) {
      System.out.printf("%s %s%n", entry.getKey(), Arrays.toString(entry.getValue()));
    }
  }
}

如果每个对象代表一个获胜者,您的 PrizeWinners class 可能不应该是复数。您正在使用 PrizeWinner 数组来表示多个获奖者。

请注意 toString 已被覆盖。

PrizeWinner.java

public class PrizeWinner {
  private String first;
  private String last;

  public PrizeWinner(String first, String last) {
    this.first = first;
    this.last = last;
  }

  @Override
  public String toString() {
    return String.format("%s %s", first, last);
  }
}

输出

2008 [hey Hey, null, null]
public void displayAllYearsAndWinners(){
    Set<String> years = winners.keySet();
            for(String year : years){
                PrizeWinners [] list = winners.get(year);
                for(PrizeWinners prizeWinners : list){
                   System.out.println(year + " " +   prizeWinners.first+" "+ prizeWinners.last); 
            }
         }
   }