计算字符串java 8

时间:2017-05-01 05:44:52

标签: java-8

我正在尝试使用Java 8编写一个方法,它接受两个参数,一个字符串和一个整数。 Method将返回另一个类似于输入字符串的字符串,但删除了某些字符。

它将从相同字符的连续运行中删除字符,其中运行的长度大于输入参数。

我可以使用简单的Java for循环来做这个,但我正在寻找使用Java 8特性的解决方案,可能是lambda表达式。例如,如果方法的输入是(“aaab”,2)那么它应该返回“ aab“和if(”aabb“,1)它应该返回”ab“。

以下是使用for循环的代码

     public String eliminate(String S, int allowed) {
         int count = 1;
         StringBuilder sb = new StringBuilder();

         try {
             sb.append(S.charAt(0));
             for (int i = 1; i < S.length(); i++) {
                 if (S.charAt(i) == S.charAt(i - 1)) {
                     if (count < allowed) {
                         sb.append(S.charAt(i));
                         count = count + 1;
                     }
                 } else {
                     sb.append(S.charAt(i));
                     count = 1;
                 }
             }

         } catch (StringIndexOutOfBoundsException e) {
             e.printStackTrace();
         }
         return sb.toString();
     }

1 个答案:

答案 0 :(得分:1)

您是否有理由使用Java 8功能?我认为流不会很优雅,因为流一次只能查看一个元素。为了记住以前的元素,你基本上也必须做同样的事情。其他新功能似乎也不是特别有用。

相反,我认为,一个普通的正则表达式正是你所需要的:

private static String eliminate(String input, int limit)
{
    return input == null ? null : input.replaceAll("(.)(\\1{" + (limit - 1) + "})\\1*", "$1$2");
}

此方法将重复字符的每个序列缩短到指定的长度。替换的工作原理如下:

  • 查找具有的子字符串
    • (.)一个字符(使用其他内容代替'。',例如\ w代表特定字符)
    • (\\1{" + (limit - 1) + "})后跟(limit-1)相同的字符
    • \\1*后跟任意数量的相同字符
  • 并替换为
    • $1第一部分(一个字符)和
    • $2第二部分(限制1个字符)