Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除数组中的特定连续元素_Java_Arrays_String_Algorithm - Fatal编程技术网

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();
}