【问题标题】:Create map from two lists with key and value as same object从两个列表创建映射,键和值作为相同的对象
【发布时间】:2018-05-03 23:16:08
【问题描述】:

我有 2 个包含对象的列表。这两个列表可以具有不同顺序的相同对象。

我已经重写了 Object 中的 equals 方法,这样如果对象的一个​​特定属性与另一个 Object 相同,那么即使其他属性不同,它们也是相等的。

现在我需要创建一个映射,其中键是一个列表中的对象,值是另一个列表中的相同对象。如果一个列表中的对象在另一个列表中没有相等的对象,则在创建地图时应忽略这些对象。

我如何使用 java 流来完成此任务?

【问题讨论】:

  • 你已经尝试了什么?
  • 你还需要第一个列表吗?不能直接把第二个列表中的对象排列成一个map,其中key就是需要匹配的属性吗?
  • 如果您有两个包含相同对象的列表,您可以只删除一个并且不会丢失任何信息。
  • key is the Object from one list and value is the same Object from the other list. 当键与值完全相同时,您真的需要映射吗?
  • @dehasi 如果您阅读我的问题,即使对象相同(覆盖等于),也有具有不同值的属性

标签: java lambda stream


【解决方案1】:

我明白你为什么要做这样的事情,但它看起来很老套。我敢肯定,如果您告诉我们您想要达到的目标,我们可以为您提供更好的设计。无论如何,以下内容适用于 Java 10:

var list1 = List.of("One", "Two", "Three");
var list2 = List.of("Two", "Three", "Four");

var set = Set.copyOf(list2);

var map = list1.stream()
               .filter(set::contains)
               .collect(Collectors.toMap(k -> k, v -> list2.get(list2.indexOf(v))));

System.out.println(map);

输出:

{Two=Two, Three=Three}

为 Java 8 编写的等效代码如下:

List<String> list1 = Arrays.asList("One", "Two", "Three");
List<String> list2 = Arrays.asList("Two", "Three", "Four");

Set<String> set = new HashSet<>(list2);

// Defined the Map here for formatting reasons.
Map<String, String> map;

map = list1.stream()
           .filter(set::contains)
           .collect(Collectors.toMap(k -> k, v -> list2.get(list2.indexOf(v))));

System.out.println(map);

注意:这假设您已覆盖 Object#hashCodeObject#equals

【讨论】:

  • 谢谢雅各布。如果两个对象相同(一个属性相同)并且其他属性不同,我需要执行一些操作,例如编辑文件。另一种选择是遍历列表并在另一个列表中找到相同的对象,我认为创建地图可能是更好的选择。
  • 是的,我就是这么想的。如果您需要我重写它以使用 Java 10 以外的版本,请告诉我!
  • 只是想看懂代码,这个语句list2.get(list2.indexOf(v))是怎么保证获取到的和第一个list一样的对象呢?
  • @gechu Well list2.indexOf(v)list2 中获取等于v 的第一个对象的索引。然后,list2.get(...) 实际上从list2 内的索引中获取元素。
猜你喜欢
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多