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