【问题标题】:What is the best way to search 2 lists to compare values? [closed]搜索 2 个列表以比较值的最佳方法是什么? [关闭]
【发布时间】:2019-07-16 21:35:02
【问题描述】:

我有两个列表,一个列表包含一种类型的对象/类,第二个列表包含另一种类型的对象。但是,不同的对象有一个共同的字段,其值可以提供两个对象之间的链接。所以如果这个字段是一个字符串,我只会比较两个不同对象之间的字符串值。

搜索列表以比较列表中的元素以查找两个列表中的哪些元素具有链接的最佳方法是什么?

最简单的方法是使用 2 个循环,但更有效的方法是什么?

【问题讨论】:

  • 这些对象是否共享一个包含公共属性的公共父类,或者这些对象是两个不同的类,它们的可敬属性恰好具有相同的名称?
  • 每个列表中是否可以有多个具有相同值的对象?如果没有,最快的方法是使用其中一个列表为对象创建一个 Map 值,然后迭代另一个列表并查找以找到匹配项。如果可能存在重复值,那么您首先需要决定在这种情况下应该发生什么,例如如果第一个列表有 2 个值为“foo”的对象,第二个列表有 3 个值为“foo”的对象,会发生什么?
  • @RAZ_Muh_Taz。他们不共享一个共同的父类。属性的名称也不同(或可能相同)。这是我正在比较的属性的值。所以这两个类是不同的,但通过其中一个字段的值有一个共同的链接。
  • @Andreas。是的,在其中一个列表中,可以有多个元素的字段值相同。在另一个列表中,只能有一个具有该特定值的元素。
  • @Mars 然后使用其他列表构建地图。

标签: java search


【解决方案1】:

假设list2 中的值是唯一的,构建一个Maplist2 中的值作为键,然后迭代list1 以查找匹配项:

Map<String, Class2> map2 = new HashMap<>();
for (Class2 obj2 : list2)
    if (map2.put(obj2.getValue(), obj) != null)
        throw new IllegalStateException("Duplicate value in list2: " + obj2.getValue());
for (Class1 obj1 : list1) {
    Class2 obj2 = map2.get(obj1.getValue());
    if (obj2 != null) {
        // found match
    }
}

【讨论】:

    猜你喜欢
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 2017-08-17
    • 2015-08-21
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    相关资源
    最近更新 更多