我正在尝试使用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();
}
答案 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个字符)