【问题标题】:Trying to add Array of Strings via Another Class using HashMap尝试使用 HashMap 通过另一个类添加字符串数组
【发布时间】:2015-09-25 18:58:34
【问题描述】:

基本上我知道如何用 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); 
            }

         }

   }

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

我觉得我已经很接近了,因为它返回了 3 次“2008”,但只有内存地址或其他 3 次为 null(因为我还没有添加其他 2 个数组,但仍在测试它是否有效)

任何帮助将不胜感激,我觉得它的名称或方法是我需要调用的,我不确定。

【问题讨论】:

  • 什么时候返回?你的return 声明在哪里?
  • 我有一个单独的方法,可以在每个循环的两个中间打印名称,所以我猜它实际上不会像通过 System.out.println 打印和打印出来那样返回它打印内存地址。
  • 你也应该包含那个方法。
  • 好的,我现在就编辑它
  • 我现在把方法放在那里

标签: java arrays string hashmap


【解决方案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的内存地址。

解决此问题的最简单方法是覆盖 PrizeWinners 类中的 toString()。这让您可以自己决定类的 String 表示应该是什么。

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

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

【讨论】:

  • 我收到不兼容的类型消息:无法将 PrizeWinners 转换为 PrizeWinners[] 其显示列表作为原因
  • 期望的输出是显示年份和名字和姓氏。
  • 奇怪的是它实际上会编译并让我打印出内存地址,现在即使我将它返回到我写它的原始方式也不会
  • 我取出了第二个 PrizeWinners[],然后将 PrizeWinners 放在每个循环的第二个
  • 我重新输入 Arrays.toString 以获取名称,我得到一个“找不到适合 toString PrizeWinners 的方法。
【解决方案2】:

您的 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】:
         for(String year : years){
            PrizeWinners [] list = winners.get(year);
            for(PrizeWinners winnerName: list){
                  System.out.println(year + " " +   winnerName.firstName + " " + winnerName.lastName); 
    
            }
    
         }
    

    【讨论】:

    • 我得到 PrizeWinners 无法转换为 PrizeWinners[]
    【解决方案4】:
    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); 
                }
             }
       }
    

    【讨论】:

      猜你喜欢
      • 2021-03-09
      • 2013-08-07
      • 2015-07-15
      • 1970-01-01
      • 2017-02-13
      • 2017-02-20
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多