首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LinkedHashMap containsKey或containsValue

LinkedHashMap containsKey或containsValue
EN

Stack Overflow用户
提问于 2013-01-04 22:12:04
回答 2查看 6.9K关注 0票数 2

为什么会发生这种事,我怎样才能避免呢?我想它只检查参考资料,但不太方便。

代码语言:javascript
复制
import java.util.LinkedHashMap;

public class CheckingLinkedHashMap {

    public static void main(String[] args) {
        LinkedHashMap<String[], String[]> linkedh = new LinkedHashMap<>();
        String[] a = "A".split(",");
        String[] ab = "A,B".split(",");
        linkedh.put(a, ab);
        String[] aa = "A".split(",");
        String[] aabb = "A,B".split(",");
        System.out.println("Contains key: " + linkedh.containsKey(aa));
        System.out.println("Contains value: " + linkedh.containsValue(aabb));

        System.out.println("Contains key: " + linkedh.containsKey(a));
        System.out.println("Contains value: " + linkedh.containsValue(ab));
    }
}

--

代码语言:javascript
复制
Contains key: false
Contains value: false
Contains key: true
Contains value: true

更新

代码语言:javascript
复制
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class CheckingLinkedHashMap {

    public static void main(String[] args) {

        LinkedHashMap< List<String>, List<String>> linkedh = new LinkedHashMap<>();

        String[] a = "A".split(",");
        String[] ab = "A,B".split(",");
        List<String> al = Arrays.asList(a);
        List<String> abl = Arrays.asList(ab);
        linkedh.put(al, abl);

        String[] aa = "A".split(",");
        String[] aabb = "A,B".split(",");
        List<String> aal = Arrays.asList(aa);
        List<String> aabbl = Arrays.asList(aabb);
        linkedh.put(aal, aabbl);

        String[] aaa = "A,B".split(",");
        String[] aaabbb = "A,B".split(",");
        List<String> aaal = Arrays.asList(aaa);
        List<String> aaabbbl = Arrays.asList(aaabbb);
        linkedh.put(aaal, aaabbbl);

        String[] aaaa = "B,A".split(",");
        String[] aaaabbbb = "A,B".split(",");
        List<String> aaaal = Arrays.asList(aaaa);
        List<String> aaaabbbbl = Arrays.asList(aaaabbbb);
        linkedh.put(aaaal, aaaabbbbl);

        Iterator it = linkedh.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry pairs = (Map.Entry) it.next();
            System.out.println("Key : " + pairs.getKey() + " Value : " + pairs.getValue());
        }

        System.out.println("Contains key: " + linkedh.containsKey(aal));
        System.out.println("Contains value: " + linkedh.containsValue(aabbl));

        System.out.println("Contains key: " + linkedh.containsKey(al));
        System.out.println("Contains value: " + linkedh.containsValue(abl));
    }
}

--

代码语言:javascript
复制
Key : [A] Value : [A, B]
Key : [A, B] Value : [A, B]
Key : [B, A] Value : [A, B]
Contains key: true
Contains value: true
Contains key: true
Contains value: true

这似乎是可行的,我想我必须做一些额外的检查,以避免关键重复。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-04 22:19:34

问题是,在默认情况下,您使用的数组是比较是否相等的。为了解决您的问题,您应该将它们封装到一个类中,并覆盖适当的方法:

代码语言:javascript
复制
class StringBundle {
  String[] strings;

  @Override
  public boolean equals(Object o) {
    // various checks
    return Array.deepEquals(this.strings, o.strings);
  }

  @Override
  public int hashCode() {
    return Arrays.hashCode(strings);
  }
}

您也需要一种方法来提供您自己版本的hashCode(),否则您将无法在散列容器中成功地使用该类。请注意,Arrays.hashCode做的是不适合嵌套数组的浅层哈希码计算。

票数 4
EN

Stack Overflow用户

发布于 2013-01-04 22:17:44

containsKeycontainsValue函数可能以equals()和/或hashCode()的方式工作。对于String[],正如您正确指出的那样,这些可能是引用方面的。除非您可以将比较器与containsKey()containsValue()一起传递,否则您的选项将变成创建自己的类来执行String[]所做的工作,除非它可以以相同值的对象相等的方式计算equals()hashCode()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14165830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档