【问题标题】:Filter `List` based on another `List` [duplicate]根据另一个`List`过滤`List` [重复]
【发布时间】:2020-06-30 11:44:48
【问题描述】:

我正在使用下面的函数来过滤基于另一个列表的列表。例如:programLines [1, 2, 4, 5, 5, 6, 6, 7, 7, 9, 13] 和行 [9, 10, 13, 14] 到此输出 [9, 13]。但是我想将其更改为此输出--> [9,0,13,0] 换句话说,以填充值为0 的其余元素。

public List<Integer> filter(List<Integer> lines, List<Integer> programLines)              
            List<Integer> listOutput =
                lines.stream().filter(programLines::contains).collect(Collectors.toList());
            return listOutput;
          }

【问题讨论】:

标签: java arrays list filter java-stream


【解决方案1】:

使用map 代替filter

public List<Integer> filter(List<Integer> lines, List<Integer> programLines)              
    List<Integer> listOutput =
        lines.stream()
             .map(i -> programLines.contains(i) ? i : 0)
             .collect(Collectors.toList());
    return listOutput;
}

如果programLines 很大,将其转换为Set 可能会有所帮助以获得更好的性能:

public List<Integer> filter(List<Integer> lines, List<Integer> programLines)              
    Set<Integer> filter = new HashSet<>(programLines);
    List<Integer> listOutput =
        lines.stream()
             .map(i -> filter.contains(i) ? i : 0)
             .collect(Collectors.toList());
    return listOutput;
}

【讨论】:

  • 我得到了这个输出 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 13] 但我需要的是这样的:[9,0,13,0]
  • @Alex 看起来你交换了列表。如果您在较短的列表 ([9, 10, 13, 14]) 上进行流式传输,则输出必须恰好有 4 个元素。
  • 不要将结果赋值给变量,而是立即返回。
  • @Eran - 您输入的速度和准确度如何!惊人的!您的答案是在问题发布一分钟后发布的。
  • @Eran 我怎样才能得到我想要的输出?你能相应地更改代码吗
猜你喜欢
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 2012-01-13
  • 2012-03-07
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多