【问题标题】:Comparing an arrayList with a Set in javajava中将arrayList与Set进行比较
【发布时间】:2017-06-10 22:21:42
【问题描述】:

我的套装是这样的,

final public static Set<String> env = new HashSet<String>(
           Arrays.asList("DEV", "QA", "PREPROD", "PROD"));

我的 arrayList 将从 DB 动态填充,其中所有 4 或更少(例如:DEV、QA)

如何在 arraylist 中找到缺失的元素并打印出来?

【问题讨论】:

  • Set 有一个 contains 方法。这里有什么问题?

标签: java arraylist set iteration


【解决方案1】:

给定两个集合,ab,这是一种列出 a 的内容的方法,这些内容不在 b 中。

a.stream()
   .filter(x -> !b.contains(x))
   .forEach(System.out::println);

没有流,你可以这样做:

for (String x : a) {
   if (!b.contains(x)) {
       System.out.println(x);
   }
}

【讨论】:

  • @BenArnao 是的,这就是问题所在。您再次发布了同样的内容,没有为这个问题增加任何价值。
  • 虽然我先发了
【解决方案2】:
for (String element : array)
    if (!otherarray.contains(element))
        print(element);

【讨论】:

    【解决方案3】:

    使用 removeAll method 复制 Set 并删除 List 中的所有元素。您将得到一个包含缺失的 Set:

    List<String> list = ...;
    Set<String> set = ...;
    
    Set<String> copy = new HashSet<>(set);
    copy.removeAll(list);
    System.out.println(copy);
    

    【讨论】:

    • 为什么另一个 Set 的开销...还有很多其他的解决方案。查看@khelwood 的回复。
    • 如果你现在想对缺失的元素做一些事情,那么这很有用,如果你想保留它们以备后用,那就不是很多了。这个问题还表明 Set 中不会有那么多值,所以担心开销对我来说听起来像是过早的优化......
    • @Exception_al 具有Stream 的所有开销。而这个答案也是the Java Tutorials 中建议的成语(参见“设置接口批量操作”部分)。
    【解决方案4】:

    您应该使用包含代码中所有可能值的枚举。

    那么你可以这样做:

    Arrays.asList(YourEnum.values()).removeAll(<elements_got_from_database>));
    

    【讨论】: