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

时间:2015-07-08 03:20:50

标签: java arrays string hashmap

基本上我知道如何使用ArrayList来做这件事,但是使用Array i来做这件事是完全难倒的。

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); 
            }

         }

   }

这只返回内存地址而不是实际的字符串(PrizeWinners类在构造函数中有两个字符串参数,以及两个用于名和姓的set方法)

我觉得我很接近,因为它回归&#34; 2008&#34;三次,但只有内存地址或其他三次为空(因为我还没有添加其他2个阵列,但仍在测试它是否有效)

任何帮助都会非常感激,我觉得这是一个我需要打电话的名字或方法,我不确定。

4 个答案:

答案 0 :(得分:1)

第一个问题是循环应该如下:

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

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

这一行:

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

等同于以下内容:

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

由于yearString,因此其toString()方法只会按预期返回其值。

namesArray。其toString()方法直接从Object继承,并打印names的内存地址。

解决此问题的最简单方法是覆盖班级toString()中的PrizeWinners。这可以让您自己决定班级的String表示形式。

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

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

答案 1 :(得分:1)

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

        }

     }

答案 2 :(得分:1)

你的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类可能不应该是复数。您正在使用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]

答案 3 :(得分:0)

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); 
            }
         }
   }