【问题标题】:Remove an element from List A, Compare a list A and an String Array B and remove elements from array B, which are in List A,从列表 A 中删除一个元素,比较一个列表 A 和一个字符串数组 B,并从数组 B 中删除列表 A 中的元素,
【发布时间】:2018-10-09 11:49:36
【问题描述】:

我有一个列表和一个字符串数组

String[] B
List<String> A

我想检查 List A 中是否存在一个元素,将其删除, 然后删除数组 B 中的元素,这些元素在列表 A 中,

如何在 Java 8 中使用流在一行中完成?

这就是如何从 List 中删除元素 A.stream().filter(element -> !element.equalsIgnoreCase(tobeIgnored).collect(Collectors.toList());

【问题讨论】:

  • 添加了一个例子
  • 您要从数组 B 中删除列表 A 的 所有 个元素,还是从数组 B 中删除指定的元素(如果它存在于列表 A 中)?
  • #1 从列表A中删除元素,如果匹配条件,则如果数组B的任何元素在列表A中,则从数组B中删除该元素,
  • 这是两个独立的任务。为什么你希望在一行中完成这两件事?
  • 没什么特别的原因,在想能不能把这两个代码结合起来……

标签: java-8 java-stream


【解决方案1】:

首先,我会从 A 创建一个 HashSet 并从数组中创建一个 List:

List<String> list = new ArrayList<>(Arrays.asList(B));
Set<String> set = new HashSet<>(A);

然后只用你想要的元素创建数组:

list.removeIf(set::contains);
list.toArray(new String[0]);

【讨论】:

    【解决方案2】:

    似乎这是有效的:

    List A
    Array B
    
    B = Arrays.stream(B).filter(s -> !(A.stream().filter(el ->  
    !el.equalsIgnoreCase("ok")).collect(Collectors.toList())). 
    contains(s)).toArray(String[]::new);
    

    【讨论】:

    • 我希望我永远不会在生产中看到这种代码!但这不是代码的错:它满足了奇怪的要求,而且做得非常好!
    • 我同意,它不可读,我可能也不会这样做!
    • 除了几乎不可读之外,它使用contains 覆盖一个列表,即O(N^2)。而这一切都是因为希望在一行中编写两个独立的任务......
    猜你喜欢
    • 2019-07-29
    • 2021-02-18
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2021-06-27
    相关资源
    最近更新 更多