基本上我知道如何使用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个阵列,但仍在测试它是否有效)
任何帮助都会非常感激,我觉得这是一个我需要打电话的名字或方法,我不确定。
答案 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());
由于year
是String
,因此其toString()
方法只会按预期返回其值。
但names
是Array
。其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);
}
}
}