在字符串的每个第3个字符后附加dash(-)的流等效项

时间:2018-12-31 09:27:09

标签: java java-stream

我创建了一个简单的基于循环的解决方案,将破折号(-)加在每三位数上。

 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流的等效解决方案。这是非常基本的情况,我想知道如何使用流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("-"));
  }

1 个答案:

答案 0 :(得分: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);

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