【问题标题】:Get value from Hashmap by user object通过用户对象从 Hashmap 中获取值
【发布时间】:2016-12-19 20:13:47
【问题描述】:

我有这样的hashmap

HashMap<Man, Double> d = new HashMap<>();

然后我添加新的一对。

d.put(new Man("John"), 5.);

如何从该地图中检索这对? 我试着做:

Man man = new Man("John");
System.out.println(d.get(man));

但结果我有null,而我期望5

【问题讨论】:

  • 可能想试试getvalues?也许可以工作..
  • @Eran 不。我该怎么做?
  • @RomaKarageorgievich 也许您应该从阅读HashMap Javadoc 开始。或者谷歌一下。
  • 您需要根据您将如何知道两个“Man”实例相等来实现 Man.equals()。只有这样 HashMap 才能发现这个新的“新人”等于旧的“新人”

标签: java dictionary hashmap


【解决方案1】:

这只有在你覆盖Man 中的方法 equals(Object obj)hashCode() 以允许你的 HashMap 了解即使它们不是相同的实例时才有效,它们具有相同的内容,应被视为地图中的相同键。

所以假设你的班级Man 是这样的:

public class Man {
    private final String name;

    public Man(final String name) {
        this.name = name;
    }
    ...
}

如果您要求您的 IDE 为您生成方法,您会得到如下信息:

@Override
public boolean equals(final Object o) {
    if (this == o) return true;
    if (o == null || this.getClass() != o.getClass()) return false;
    final Man man = (Man) o;
    return Objects.equals(this.name, man.name);
}

@Override
public int hashCode() {
    return Objects.hash(this.name);
}

【讨论】:

    【解决方案2】:

    您需要有一些独特的东西来定义对象Man。 在您的情况下,它似乎是 -name

    因此,您在 Man 类中使用 name 作为唯一标识符覆盖 equals() 方法和类似的 hashcode() 方法。

    由于name 是一个字符串,您可以将任务委托给String 类中的类似方法。

    【讨论】:

      【解决方案3】:

      HashMap 工作正常。仅仅因为你创建了两个同名的新对象,并不意味着计算机认为它们是同一个对象。

      尝试以下方法:

      man1 = new Man("John");
      man2 = new Man("John");
      
      if (man1 == man2) {
           System.out.println("Equal");
      } else {
          System.out.println("Not equal");
      }
      

      您将得到“不相等”,因为计算机正在检查它们是否是完全相同的对象,而不仅仅是名称相同。

      每次您使用“new”关键字时,您都在声明一个新对象,计算机会为其提供一个唯一地址。

      试试这个:

      man1 = new Man("John");
      
      HashMap<Man, Double> myList = new HashMap<>();
      myList.put(man1, "5.00");
      System.out.print.ln(myList.get(man1));
      

      你会看到你现在得到了“5.00”,因为你实际上给了它作为地图键的确切对象。

      如果您希望行为像这样工作,您需要手动定义如何确定两个“人”是平等的。使用全名作为键可能会更好,因为这通常是唯一的,并且实现的工作量更少。

      【讨论】:

      • 你会注意到它编译没有错误,因为计算机将那些“Johns”识别为不同的实体。这里会出现什么样的编译器错误?
      • 更好,但我认为man1.equals(man2) 会更相关。整个答案似乎过分强调了引用相等的概念,这超出了 OP 的控制范围,并且可能已经被理解。
      猜你喜欢
      • 2020-07-15
      • 2023-04-06
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 2014-06-17
      • 2017-10-27
      • 1970-01-01
      相关资源
      最近更新 更多