【问题标题】:Java List contains element of another list of a different typeJava List 包含另一个不同类型的列表的元素
【发布时间】:2018-07-24 00:39:50
【问题描述】:

我想问是否有更好的方法来查找一个 List 是否包含另一个不同类型的 List 的至少一个元素。

例如

public class AnotherType{
  private int x;
  private String label;
  ....
}


List<String> list1 = new ArrayLis<String>();
list1.add("inst1");
list1.add("inst2");
list1.add("inst3");
List<AnotherType> list2 = new ArrayList<AnotherType>();
list2.add(new AnotherType(1,"inst7"));
list2.add(new AnotherType(1,"inst1"));

现在我想查找索引 1(第二个元素)中的 list2 包含存在于 list1 中的元素“inst1”。 这比在另一个循环中创建一个循环更好吗? 我使用 java 1.6

【问题讨论】:

  • Streams 很擅长这个。为什么选择 Java 6?它落后了 3 个主要版本。
  • 只需遍历列表 1,一旦找到也在列表 2 中的元素,就中断。你试过什么?你如何定义“更好”?
  • 如果inst7 等是唯一的,您可以创建一个Map&lt;String, AnotherType&gt;。或者Map&lt;String, List&lt;AnotherType&gt;&gt;.
  • 如果insts 是唯一的,并且您不关心list1 的顺序,则可以将其建模为HashSet,之后list1.contains() 将花费更少的时间.

标签: java list contain


【解决方案1】:

如果您将list1 表示为一个HashSet,则.contains() 操作将比O(1) 快得多,而ArrayList.contains() 将是O(n)

List<String> list1 = new ArrayLis<String>();
list1.add("inst1");
list1.add("inst2");
list1.add("inst3");

List<AnotherType> list2 = new ArrayList<AnotherType>();
list2.add(new AnotherType(1,"inst7"));
list2.add(new AnotherType(1,"inst1"));

Set<String> set1 = new HashSet<>(list1);

for(AnotherType elem : list2) {
     if(set1.contains(elem.getLabel())) {
         //  Do your thing here.
         return true;
     }
}

【讨论】:

    【解决方案2】:

    试试这样的:

    for( final AnotherType item : list2 )
    {
      if ( list1.contains(item.getLabel() )
      {
        // TODO what do you want to do with the found items?
      }
    }
    

    【讨论】:

    • 这如何回答“有没有比在另一个循环中制作一个循环更好的方法?”的问题?
    • 您似乎没有真正解释为什么您的方式更好。这只是一个代码转储。
    猜你喜欢
    • 1970-01-01
    • 2014-01-19
    • 2011-11-30
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多