【问题标题】:Merge List of Strings via concatenation of elements in Java通过 Java 中的元素连接来合并字符串列表
【发布时间】:2023-03-27 14:35:01
【问题描述】:

我有一个 CSV 文件,我从该文件中读取多个列(基于用户输入)为 List<String>,并希望生成一个 List<String>,这样新的 List 的每个元素都是相应元素的串联在以“_”分隔的个人Lists 中。

这意味着生成的 List<String> 的大小与每个 List 的大小相同。

例如

文件

col1A、col2A、col3A

col1B、col2B、col3B

用户输入(范围:1 到文件中的最大列数)

2,3

输出:包含内容的列表

["col2A_col3A", "col2B_col3B"]

更喜欢使用 Streams 的功能解决方案。

尝试写一个单行:

 Arrays.stream("2,3".split(",")
            .map(Integer::parseInt)
            .map(idx -> colProcessor.getColumn(idx)) // colProcessor.getColumn(idx) returns column with index 'idx' as List<String>
            .collect(Collectors.toList());

但是,这会将 2 列连接成一个大小为 2*&lt;size of each column&gt;List,这不是预期的目标。

【问题讨论】:

  • 您好,请阅读minimal reproducible example。并提供您目前编写的代码以及您面临的问题。
  • 您发布了代码要求,但我没有看到阻止您编写自己的代码的问题描述。请edit您的问题并包括您的尝试/研究。
  • 更新了问题。让我知道这是否有意义。谢谢!
  • 我不明白为什么人们坚持Streams 并强迫他们解决他们天生不适合的问题。我的意思是,你可能可以用Stream 来做,但我敢肯定它看起来会很不愉快。

标签: java functional-programming java-8 java-stream


【解决方案1】:

你需要做一个reduce,它将把你的Stream&lt;List&lt;String&gt;&gt;变成一个List&lt;String&gt;,并得到连接的结果:

Arrays.stream("2,3".split(","))
      .map(Integer::parseInt)
      .map(idx -> colProcessor.getColumn(idx))
      .reduce(new ArrayList<>(), (a, b) -> IntStream.range(0, b.size()).mapToObj(i -> {
          if (a.size() != 0) {
              return a.get(i) + "__" + b.get(i);
          } else {
              return b.get(i);
          }
      }).collect(Collectors.toList()));

在reduce 中a 开始时是一个空列表(因此会检查大小以使a.get 在第一次传递时不会抛出IndexOutOfBounds 异常)。然后,在每次通过时,您将累积的结果放在a 中,并将值附加到b 中。为此,我们使用IntStream.range,它将为我们提供b 数组中的索引流,并在该映射中进行连接。

【讨论】:

    猜你喜欢
    • 2012-08-30
    • 2018-10-29
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多