Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试使用HashMap通过另一个类添加字符串数组_Java_Arrays_String_Hashmap - Fatal编程技术网

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

Java 尝试使用HashMap通过另一个类添加字符串数组,java,arrays,string,hashmap,Java,Arrays,String,Hashmap,基本上,我知道如何使用ArrayList实现这一点,但要使用ArrayList实现这一点,我完全被难倒了 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, PrizeW

基本上,我知道如何使用ArrayList实现这一点,但要使用ArrayList实现这一点,我完全被难倒了

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

         }

   }
import java.util.HashMap;
导入java.util.Set;
导入java.util.Iterator;
导入java.util.Map;
导入java.util.Collection;
公共类诺贝尔奖得主
{
私人哈希图优胜者;
公共诺贝尔奖得主
{
winners=新HashMap();
获奖者[]姓名=新获奖者[3];
名称[0]=新获奖者(“嘿”,“嘿”);
优胜者。put(“2008”,名称);
}
}
公开作废显示所有年份和获奖者(){
设置年份=winners.keySet();
用于(字符串年份:年){
PrizeWinners[]列表=winners.get(年份);
对于(获奖者[]姓名:列表){
系统输出打印项次(年份+“”+名称);
}
}
}
这只返回内存地址,而不是实际的字符串(PrizeWinners类在构造函数中有两个字符串参数,以及名字和姓氏的两个set方法)

我觉得我已经很接近了,因为它返回了三次“2008”,但剩下的三次都是内存地址或null(因为我还没有添加其他两个数组,所以我还在测试它是否有效)


任何帮助都将不胜感激,我觉得这是一个我不确定的名字或方法

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

for (String year: years) {
    PrizeWinners[] list = winners.get(year);
    for (PrizeWinners names: list) {
        System.out.println(year + " " + names);
    }
}
System.out.println(year.toString() + " " +   names.toString()); 
因为您已经将
列表
作为一个数组进行检索,所以for-each循环在每次迭代中返回一个
PrizeWinners
,而不是另一个数组

这一行:

System.out.println(year + " " +   names); 
相当于以下内容:

for (String year: years) {
    PrizeWinners[] list = winners.get(year);
    for (PrizeWinners names: list) {
        System.out.println(year + " " + names);
    }
}
System.out.println(year.toString() + " " +   names.toString()); 
由于
year
是一个
String
,因此它的
toString()
方法会像预期的那样简单地返回它的值

但是
名称
是一个
数组
。它的
toString()
方法直接继承自
对象
,并打印
名称
的内存地址

解决这个问题的最干净的方法是重写类
PrizeWinners
中的
toString()
。这让您自己决定类的
字符串
表示应该是什么

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

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

在DisplayAllYears和Winners方法中发生了一些奇怪的事情。可以简化为:

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

        }

     }
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()));
    }
  }
}
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 display allyears and winners(){
设置年份=winners.keySet();
用于(字符串年份:年){
PrizeWinners[]列表=winners.get(年份);
适用于(获奖者:名单){
System.out.println(年份+“”+获奖者。第一名+“”+获奖者。最后一名);
}
}
}

什么时候返回?你的<代码>返回< /Cord>语句?我有一个单独的方法,在每个循环中为两个循环打印名称,所以我猜它实际上并没有通过System.out.println打印返回那么多,当它打印出来时,它会打印内存地址。你也应该包括这个方法。好的,我现在就编辑它,我把这个方法放在那里,现在我得到一个不兼容的类型消息:PrizeWinners不能转换为PrizeWinners[]它的显示列表是它为什么要显示年份以及名字和姓氏的原因。奇怪的是,它实际上会编译并让我打印出内存地址,现在甚至当我将其返回到我原来编写的方式时,它也不会了。我取出了第二名获奖者[]每次循环都将PrizeWinners放在第二位我重新键入Array.toString返回名称,我会得到一个“找不到适合toString PrizeWinners的方法。我得到PrizeWinners无法转换为PrizeWinners[]