Java 删除数组中的特定连续元素
我试图将数组的连续元素减少为一个,但不是所有值都是这样:Java 删除数组中的特定连续元素,java,arrays,string,algorithm,Java,Arrays,String,Algorithm,我试图将数组的连续元素减少为一个,但不是所有值都是这样: {3,0,0,0,3,3,3,0,0,0} => {3,0,3,0} 但对于特定的一个,在我的示例0中: {3,0,0,0,3,3,3,0,0,0} => {3,0,3,3,3,0} 所以只有零(三个是完整的)被减少 我编写了Java字符串工作代码: public static String removeConsecutive(String str, char remove) { char[] chars = st
{3,0,0,0,3,3,3,0,0,0} => {3,0,3,0}
但对于特定的一个,在我的示例0中:
{3,0,0,0,3,3,3,0,0,0} => {3,0,3,3,3,0}
所以只有零(三个是完整的)被减少
我编写了Java字符串工作代码:
public static String removeConsecutive(String str, char remove) {
char[] chars = str.toCharArray();
int current = 0;
int result = current;
while (current < chars.length) {
if (chars[current] == remove) {
// keep the first occurrence
chars[result++] = chars[current++];
// ignore the others
while (current < chars.length && chars[current] == remove) {
++current;
}
} else {
chars[result++] = chars[current++];
}
}
return new String(chars, 0, result);
}
输出:0303030303330
有人能提出任何改进建议吗,因为他们认为代码并不完美。认为这更清楚,并且完成了工作:
public static String removeConsecutive(String str, char remove) {
StringBuilder sb = new StringBuilder();
for(char c : str.toCharArray()) {
int length = sb.length();
if(c != remove || length == 0 || sb.charAt(length - 1) != c) {
sb.append(c);
}
}
return sb.toString();
}
如果不必安装到位:
public static String removeConsecutive(String str, char remove) {
StringBuilder bldr = new StringBuilder();
int rec = 0;
for(char curr : str.toCharArray()){
if(curr == remove){
if(rec == 0) bldr.append(curr);
++rec;
}
else{
rec = 0;
bldr.append(curr);
}
}
return bldr.toString();
}
我想这对@vidit来说是个好问题,谢谢。我将把它发布在codereview上,并粘贴到该讨论的链接。
而
循环可能是无限循环。尽量避免它们。在这种情况下,您可以用foreach
语句替换它。效率极低。这需要在str
上进行大量迭代。同意,但是任务的正确代码取决于上下文。如果系统在很长的字符串上运行数千个请求,这将不是一个有效的答案。然而,对于简单的演示或项目,简单易懂的代码是主要目标。在任何情况下,对于当前的硬件,您仍然在谈论微秒级的差异。当只更改字符时效率非常低,因为replace/replaceAll都会将其编译为Pattern,match,replace。谢谢,使用stringbuilder是有效的,但是如果这是整数数组呢?那么我会在最后使用并调用该LinkedList
。对StringBuilder.length
的调用将替换为,对StringBuilder.charAt
的调用将替换为。
int len = 0;
do {
len = str.length();
str = str.replace(replacement + replacement, replacement);
} while (len != str.length());
public static String removeConsecutive(String str, char remove) {
StringBuilder bldr = new StringBuilder();
int rec = 0;
for(char curr : str.toCharArray()){
if(curr == remove){
if(rec == 0) bldr.append(curr);
++rec;
}
else{
rec = 0;
bldr.append(curr);
}
}
return bldr.toString();
}