在每个字符串的第3个字符之后添加短划线( - )的等效流

问题描述 投票:-5回答:1

我创建了简单的基于for循环的解决方案,在每三位数上附加短划线( - )。

 private String appendedDashOnEachThirdDigit(String digitString) {
    char digits[] = digitString.toCharArray();
    StringBuilder builder = new StringBuilder();

    for (int i = 0; i < digits.length; i++) {
      char ch = digits[i];
      builder.append(ch);
      if ((i + 1) % 3 == 0 && i - 1 != digits.length) {
        builder.append('-');
      }
    }
    return builder.toString();
  }

现在我想创建基于java 8流的等效解决方案。这是非常基本的情况,我想知道如何使用stream api完成此操作?

我创建了这个基本的流函数: -

  private String appendedDashOnEachThirdDigitByStream(String digitString) {
    //char[] chars = digitString.toCharArray();
    //return IntStream.range(0, chars.length)
    //    .filter(i -> (i + 1) % 3 == 0 && i - 1 != chars.length)
    //    .collect(Collectors.collectingAndThen(Collectors.toList(),
    //        new Function<List<Object>, Object>() {
    //        }))
   return digitString.chars()
        .mapToObj(value -> String.valueOf((char) value))
        .collect(Collectors.joining("-"));
  }
java java-stream
1个回答
0
投票

虽然它可能不是最好的解决方案。

    class T {
        final int i;
        final int c;

        public T(int i, int c) {

            this.i = i;
            this.c = c;
        }
    }
    int[] i = {0};


    String res = "123456789".chars()
            .mapToObj(c -> new T(i[0]++, c))
            .collect(Collectors.groupingBy(x -> x.i / 3))
            .entrySet()
            .stream()
            .sorted(Comparator.comparing(Map.Entry::getKey))
            .map(x ->
                    x.getValue().stream().mapToInt(y -> y.c)
                            .mapToObj(y -> String.valueOf((char)y))
                            .collect(Collectors.joining())

            ).collect(Collectors.joining("-"));


    System.out.println("res = " + res);

这里的主要问题是,当元素独立时,流是好的。在您的方案中,处理取决于位置,因此需要有线分组。

© www.soinside.com 2019 - 2024. All rights reserved.