繁体   English   中英

如何删除部分数组中的所有字符重复项(未排序且不应该排序)

[英]How do you remove all char duplicates in a partial array(unsorted and not supposed to sort)

我正在尝试删除此部分数组中的重复项。 我试图将第 i 个元素与每个元素进行比较,但出了点问题。

public class deleteRepeats{
    public static void deleteRepeats(char[] c, int size){
        int i,j;
        char temp;
        char[] newArray = new char[size];
        for(i=0;i<size;i++){
            newArray[i] = c[i];
        }   
        for(i=0;i<size;i++){
            for(j=0;j<size;j++){
                if(newArray[i]==newArray[j]&&i!=j){
                    temp = newArray[j];
                    for(int k=j+1;k<size;k++){
                        newArray[k-1] = newArray[k];
                        newArray[size-1] = temp;
                        size-=1;
                    }
                }
            }
        }
        for(i=0;i<size;i++){
            System.out.print(newArray[i]+" ");
        }
    }
    public static void main(String[] args){
        char[] a = new char[10];
        a[0] = 'a';
        a[1] = 'b';
        a[2] = 'a';
        a[3] = 'e';
        a[4] = 'b';
        a[5] = 'q';
        deleteRepeats(a, 6);

    }
}

电流输出:aee

对于像这样的简单问题,您的代码太复杂了。 为了更快地做到这一点,请使用两个这样的循环

public static void deleteRepeats2(char[] c, int size){
    int i, j, k = 0;
    char[] newArray = new char[size];

    for(i=0; i < size; i++){
        for(j = 0; j < i; j++){
            if (c[j] == c[i]) 
                break;
        }

        if (j == i)
            newArray[k++] = c[i];
    }

    for(i=0; i < k; i++){
        System.out.print(newArray[i]+" ");
    }
}

或者如果你想保留你的代码

public static void deleteRepeats(char[] c, int size){
    int i,j;
    char temp;
    char[] newArray = new char[size];
    for(i=0; i < size; i++){
        newArray[i] = c[i];
    }   
    for(i = 0; i < size; i++){
        for(j = i + 1; j < size; j++){
            if(newArray[i] == newArray[j] && i != j){
                temp = newArray[j];
                for(int k = j; k < size - 1; k++){
                    newArray[k] = newArray[k + 1];
                }
                newArray[size-1] = temp;
            }
        }
    }
    for(i=0;i<size;i++){
        System.out.print(newArray[i]+" ");
    }
}

一种方法是使用流。

      char[] c = new char[10];
      c[0] = 'a';
      c[1] = 'b';
      c[2] = 'a';
      c[3] = 'e';
      c[4] = 'b';
      c[5] = 'q';

首先,您的方法应该返回新数组而不是更改源。 主要原因是您无法更改传递数组的大小,因此它仍将包含过程中剩余的“垃圾”。 您始终可以将方法的返回值分配给源数组。

其次,您不需要传递数组的大小。 你可以从c.length()


      public static char[] deleteRepeats(char[] c) {
         return Arrays.stream(String.valueOf(c).split("")).filter(
            str -> str.charAt(0) != 0).distinct().collect(
                  Collectors.joining()).toCharArray();
      }


  1. Arrays.stream() 不接受char数组,因此创建并拆分了一个字符串
  2. 然后它被过滤以跳过empty slots (您的数组大小大于其内容)
  3. 之后使用distinct()方法消除了重复项。
  4. 把琴弦连在一起
  5. 并返回一个char数组

如果您更喜欢更传统的方法,则可以这样做。

      public static char[] deleteRepeats(char[] c) {
          StringBuilder sb = new StringBuilder();
          sb.append(c[0]);  // assign first character
          for (char ch : c) {
              if (ch == 0 || sb.indexOf(ch + "") >= 0) {
                 continue;  // skip a 0 value or duplicates
              }   
              sb.append(ch);
           }
           return sb.toString().toCharArray();
      }

      char[] result = deleteRepeats(c);
      for (int i = 0; i < result.length; i++) {
         System.out.print(result[i] + " ");
      }

请记住,原始数组初始化为0 ,对象数组初始化为null 这就是为什么必须在上面的两个示例中过滤掉 0 的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM