Java:搜索对象的 ArrayList 以匹配 ID 但不同字段的有效方法

马特 C.

假设我有一个很大(> 100,000,000)的 Person ArrayList,其中 Person 定义为:

class Person {
    public int id;
    public String name;
}

我正在尝试编写一个方法,如果包含具有相同 ID 但不同名称的元素hasDuplicatePersonsWithDifferentNames(),则返回该方法例如:trueArrayList

这将返回 true,因为有两个具有不同名称的相同 id

ArrayList<Person> people = new ArrayList<Person>();
people.add(new Person(1, "bob");
people.add(new Person(1, "alice");

这将返回 false,因为虽然有两个相同的 id,但它们共享相同的名称

ArrayList<Person> people = new ArrayList<Person>();
people.add(new Person(1, "bob");
people.add(new Person(1, "bob");

我在想会有一些方法可以利用 Java Streams,众所周知,Java Streams 是高效的,甚至可能是并发性的。但我找不到任何一个例子。我知道我可以使用字典并在O(n)时间/空间中解决这个问题,但我相信使用流/并发我可以节省空间复杂性。

斯蒂芬·C

问题是你那种错误的数据结构。

如果您使用列表,则在列表中搜索某些内容涉及迭代列表。在您的情况下,这意味着(可能)测试列表中的每个元素。全部 1 亿。

使用流或并发将无济于事。您的代码仍然需要测试 1 亿个条目。(好吧,并行搜索可以为您提供 1P倍的加速,P可用物理内核的数量在哪里。但P将是小而恒定的。)

所以如果你想做得比O(N)......哪里N是一个非常大的数字......你需要一个支持基于元素字段查找的数据结构。这里有一些可能性:

  • 使用 aMap<Integer, Person>并将其填充为从idto的映射Person问题是 aMap只能为每个键保存一个值,因此您实际上无法同时将 Bob 和 Alice 存储在映射中。(但这可能是比您目前正在做的更好的解决方案。)

    你使用它HashMap,像插入删除和查找这样的操作是O(1)

  • 使用多地图。Apache Commons 和 Guava 都提供多地图类,或者您可以使用Map<Integer, List<Person>>.

  • 以上两者使用的内存都比ArrayList. 另一种选择是使列表idPerson对象排序,以便您可以执行二进制搜索。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将ArrayList保存到文件并搜索匹配的ID

Java模式匹配的有效方法

从迭代ArrayList内部删除对象的最有效方法

Android:比较两个对象的ArrayList并从第二个ArrayList中查找不匹配的ID

Java检查对象的arraylist是否包含一个对象,该对象的字段与正在寻找的int匹配

尝试在Java中查找Arraylist中对象的所有匹配项

Java:使用ArrayList编写pojo的最有效方法

查看ArrayList是否包含Java中对象的最有效方法

在 ArrayList 中搜索匹配參數

如何从两个基于键具有不同匹配的对象的 ArrayList 中取出属性

在 2 个 ArrayLists 中获取匹配和不匹配对象的最有效方法

ArrayList按ID检索对象

从Java ArrayList删除不同的对象

java ArrayList包含不同的对象

搜索 ArrayList 对象:对象的

Java JSON / GSON-搜索数组中的所有对象并返回匹配项

在ElasticSearch中仅获取_id的有效方法-Java

Kotlin Arraylist 到 Java Arraylist 的类型不匹配

在插入ArrayList之前检查ArrayList内的对象是否具有相同的ID值

在对象数组中查找匹配ID的最佳方法?

从数组搜索和返回匹配的字符串元素的有效方法

搜索二维数组的更有效方法 - 匹配后中断?

没有与类java.util.Arrays $ ArrayList的层次结构中的名称流匹配的方法

仅当存在所有ID或更多ID时才在两个不同的列表对象之间找到匹配的ID?

如何将与数组中的ID不匹配的对象与Java中数组中的不同对象进行排序?

复制或合并包含相同对象的两个ArrayList的有效方法

Java有效的方法来拥有多个相同的ArrayList元素

查找两个可迭代对象共享的匹配值数量的更有效方法?

Java ArrayList添加具有相同ID的值