java - 如何在包含具有多个键/值对的 HashMap 的列表上使用 indexOf

标签 java list comparator comparable

我有一个包含HashMapsList。列表中的每个 HashMap 可能有多个 key/value 对。我想 indexOf 在列表中找出传入的 HashMap 所在元素的索引。但是,问题是 e quals method of HashMap比较时查看整个 entrySet。这不是我想要的。

例子:

    List<HashMap> benefit = new ArrayList<HashMap>();
    HashMap map1 = new HashMap();
    map1.put("number", "1");
    benefit.add(map1);
    HashMap map2 = new HashMap();
    map2.put("number", "2");
    map2.put("somethingelse", "blahblah"); //1
    benefit.add(map2);

    HashMap find = new HashMap();
    find.put("number", "2");
    int index = benefit.indexOf(find);
    if (index >= 0)
        System.out.println(benefit.get(index).get("number"));

由于 //1 行,以上代码不会打印任何内容。

  • 我必须做什么才能使上面的代码实际打印 2
  • 有没有办法在列表上实现可比性,以便我可以定义 我自己的?

最佳答案

我想你正在寻找 retainAll(),所以你可以只比较你感兴趣的元素:

int index = myIndexOf(benefit, find);

...

static int myIndexOf(List<HashMap> benefit, Map find) {
    int i = 0;
    for (Map map : benefit) {
        Map tmp = new HashMap(map);
        tmp.keySet().retainAll(find.keySet());
        if (tmp.equals(find)) {
            return i;
        }
        i++;
    }
    return -1;
}

当然,您可以声明自己的 List 子类,用这种行为覆盖 indexOf 方法。但是,我认为这不是一个好主意。它会违反 indexOf 方法的约定:

returns the lowest index i such that (o==null ? get(i)==null : o.equals(get(i)))

这会让维护代码的其他人感到困惑。然后您可能会认为您可以将 HashMap 子类化以重新定义 equals,但这会违反 Object.equals() 的对称属性。

关于java - 如何在包含具有多个键/值对的 HashMap 的列表上使用 indexOf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9009491/

相关文章:

java - 类似: Compare the object on various parameter using compareTo

Java webapp - 在哪里放置应用程序生成的文件?

java - 为什么在 HTTP DELETE 请求中包含实体主体不是一个好习惯?

java - 如何完成不是字节数组输入流的异步 HTTP 客户端输入流?

java - 哪个更快? List.contains() 或 Map.containsKey()

c++ - 具有结构键的 std::map 的高效比较器

java - 在标准中使用 NOW() 进行查询在 psql 与 JDBC 中的行为不同

python - 递归和 append 到列表

Python 3.6 - 不要使用 Counter 在列表中包含重复值

java - 如何使用整数比较器实现选择排序?