【问题标题】:How to connect words from two lists in Java如何在Java中连接两个列表中的单词
【发布时间】:2019-05-12 13:56:19
【问题描述】:

我想从两个不同列表中的单词创建一个句子。如上例:

“list1w1 list2w1 list1w2 list2w2 list1w3 list2w3...”

我知道如何使用 for 循环,但我想使用流。有没有可能?

我目前的解决方案:

StringBuilder result = new StringBuilder();
for(int i=0; i<doses.size(); i++)
result.append(String.format("%s %s<br>", list1.get(i), list2.get(i)));

【问题讨论】:

    标签: java string list java-stream stringbuilder


    【解决方案1】:

    你可以使用zip来解决这个问题。

    通过Eclipse Collections Collectors2.zip() 使用流:

    List<String> one = Arrays.asList("list1w1", "list1w2", "list1w3");
    List<String> two = Arrays.asList("list2w1", "list2w2", "list2w3");
    
    String output = one.stream().collect(Collectors2.zip(two))
            .collect(pair -> pair.getOne() + ' ' + pair.getTwo())
            .makeString("<br>");
    

    直接使用 Eclipse Collections API:

    String output = LazyIterate.zip(one, two)
            .collect(pair -> pair.getOne() + ' ' + pair.getTwo())
            .makeString("<br>");
    

    注意:我是 Eclipse Collections 的提交者。

    【讨论】:

      【解决方案2】:

      你可以这样做,

      IntStream.range(0, list1.size())
          .mapToObj(i -> String.format("%s %s", list1.get(i), list2.get(i)))
          .collect(Collectors.joining("<br>"));
      

      这是另一种方法。

      IntStream.range(0, list1.size()).boxed()
          .collect(Collectors.mapping(i -> list1.get(i) + " " + list2.get(i), 
              Collectors.joining("<br>")));
      

      【讨论】:

        【解决方案3】:

        我相信您正在寻找的是平面地图。

        类似的东西:

        List<String> list1 = Arrays.asList("a", "b", "c");
        List<String> list2 = Arrays.asList("1", "2", "3");
        
        List<String> result = list1.stream()
                .flatMap(s1 -> list2.stream().map(s2 -> s1 + s2))
                .collect(Collectors.toList());
        
        System.out.println(result);
        

        这将打印您正在寻找的[a1, a2, a3, b1, b2, b3, c1, c2, c3]

        【讨论】:

        • 不,如果您使用flatmap,这意味着“传统”方式是使用嵌套的for 循环。 OP 只有一个 for 循环。所需的输出只是[a1, b2, c3]。其他两个答案给出了正确答案(实际上它们是相同的)。
        • 他的例子确实与他的代码相矛盾,我去了例子输出:)
        • 再次仔细检查示例。这与他的代码并不矛盾。列表 1 = a b c。列表 2 = 1 2 3. 他的示例:“list1w1 list2w1 list1w2 list2w2 list1w3 list2w3”=“a1 b2 c3”。注意 list1w1 = a, list2w1 = 1。
        【解决方案4】:

        使用IntStream

        String res = IntStream.range(0, list1.size())
                .mapToObj(i -> String.format("%s %s", list1.get(i), list2.get(i)))
                .collect(Collectors.joining("<br>"));
        

        【讨论】:

        • String.format 与普通的 .mapToObj(i -&gt; list1.get(i) + " " + list2.get(i)) 相比,在这里可能有点矫枉过正
        猜你喜欢
        • 2022-11-07
        • 1970-01-01
        • 1970-01-01
        • 2010-12-15
        • 2019-07-23
        • 2021-04-29
        相关资源
        最近更新 更多