尝试使用 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;
}
现在,当在 PrizeWinners
的 names
实例上调用隐式 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);
}
}
}
基本上我知道如何用 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;
}
现在,当在 PrizeWinners
的 names
实例上调用隐式 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);
}
}
}