簡體   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