【问题标题】:What is the efficient algorithm / way to find intersection between 2 array lists. ( I am using java 8 )找到 2 个数组列表之间的交集的有效算法/方法是什么。 (我使用的是 Java 8)
【发布时间】:2018-11-05 10:43:07
【问题描述】:

我有 2 个数组列表,其中包含一个自定义对象 Stock。

public class Stock{

    private String companyName;
    private double stockPrice;

    // getters and setters 
}

List1 包含 Stock 对象。 List2 还包含库存对象。

列表 1 和列表 2 的大小相同。列表 1 中有一些库存对象与列表 2 中的相同。我需要从列表 2 中获取列表 1 中存在的相同对象。换句话说,获取列表 1 和列表 2 中的交集2.我试图找出Java 8中是否有任何直接的方法可以有效地给出这个结果。或者如果没有,如何在时间复杂度和空间复杂度方面构造一个有效的算法?非常感谢您的帮助。

【问题讨论】:

  • 到目前为止您尝试过什么,有什么问题?
  • 你可能想看看哈希表。
  • 当您说相同的 Stock 对象时,您的意思是 == 会起作用吗?或者你对你的对象有一个相等的方法?或者你如何定义两只股票相等?
  • 我将在 Stock 类中重写一个 equals 和 hashcode 方法,如果股票公司名称、股票价格和时间戳相等,它将区分两个对象。

标签: algorithm java-8 time-complexity space-complexity


【解决方案1】:
List<T> intersect = list1.stream()
    .filter(list2::contains)
    .collect(Collectors.toList());

信用:Fat_FS 回复 Intersection and union of ArrayLists in Java

确保覆盖 equals 和 hashcode 方法(假设您想查看对象的内容以进行相等比较)

转换列表以设置更好的性能

【讨论】:

  • 感谢 Nagendra,我对这一步有点困惑,如果你可以请写小的 sn-p 会很棒。我已经检查了那个链接。
  • 它只是创建一个list1的流,过滤掉list2中不存在的元素,并将过滤后的元素收集到'intersect'链接中
  • 确实如此,但是操作的时间复杂度是多少?何时将列表转换为设置以获得更好的性能?可以请您粘贴代码sn-p吗?感谢您的帮助。
  • @Lalit 您可以将.filter(list2::contains) 替换为.filter(new HashSet&lt;&gt;(list2) ::contains),以获得更好的时间复杂度。我把它留作练习让你找出,list2 的大小开始得到回报......
  • 谢谢@Holger。谢谢大家。
猜你喜欢
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多