簡體   English   中英

noDups() 方法從數組中刪除所有重復項

[英]noDups()method to remove all duplicates from the array

它刪除 Array 中的重復項,但在接近末尾時跳過一項。 有人可以幫我解決這個問題嗎?

輸出將是這樣的:

77 44 55 33 55 22 88 11 33 66 33 

刪除重復項...

77 44 55 22 88 11 33 

它在應該打印時跳過了'66'

這是我的代碼: HighArray.java

class HighArray {
private long[] a;
private int nElems;

public HighArray(int max) {
    a = new long[max];
    nElems = 0;
}

public boolean find(long searchKey) {
    int j;
    for(j=0; j<nElems; j++)
        if(a[j] == searchKey)
            break;
    if(j == nElems)
        return false;
    else
        return true;
}

public void insert(long value) {
    a[nElems] = value;
    nElems++;
}

public boolean delete(long value) {
    int j;
    for(j=0; j<nElems; j++)
        if( value == a[j] )
            break;
    if(j==nElems)
        return false;
    else {
        for(int k=j; k<nElems; k++)
            a[k] = a[k+1];
        nElems--; 
        return true;
    }
}

public void noDups() {
    System.out.println("\nRemoving duplicates...");

    for(int i = 0; i<nElems; i++) {
        for(int j = i+1; j<nElems; j++) {
            if (a[i] == a[j]) {
                delete(a[i]);
                nElems--;
            }
        }
    }
    //return duplicates;
}

public void display(){
    for(int j=0; j<nElems; j++)
        System.out.print(a[j] + " ");
    System.out.println("");
}

}

高陣列應用程序

class HighArrayApp {

public static void main(String[] args) {

    int maxSize = 100;
    HighArray arr;
    arr = new HighArray(maxSize);

    arr.insert(77);
    arr.insert(55);
    arr.insert(99);
    arr.insert(44);
    arr.insert(55);
    arr.insert(33);
    arr.insert(55);
    arr.insert(22);
    arr.insert(88);
    arr.insert(11);
    arr.insert(33);
    arr.insert(00);
    arr.insert(66);
    arr.insert(33);

    arr.display();

    int searchKey = 35;
    if( arr.find(searchKey) )
        System.out.println("Found " + searchKey);
    else
        System.out.println("Can’t find " + searchKey);

    arr.delete(00);
    arr.delete(55);
    arr.delete(99);

    arr.display();

    arr.noDups();
    arr.display();
}

}

在遍歷數組時不應修改索引,否則會看到一些奇怪的結果。 迭代肯定會跳過一些元素,因為它們的索引不是應該的。

假設您正在像這樣迭代數組:

0 1 2 3 4 5  // indices
1 2 5 6 7 8  // array elements
^
i            // current position of i

現在刪除索引0處的元素。 然后所有剩余的元素將向左移動,但i會繼續前進。 刪除索引0處的元素后,數組結構如下:

0 1 2 3 4   // indices
2 5 6 7 8   // array elements
  ^
  i         // current position of i (Will move from 0 to 1)

看,下一個處理的元素將是5 ,而不是2 這就是您的代碼跳過元素的原因。


您可以通過向后迭代數組來解決此問題,這不會修改要處理的剩余元素的索引。 哦,你不需要嵌套 for 循環。 只需單個 for 循環即可完成任務。

像這樣修改你的循環:

for(int i = nElems; i > 0; i--) {
        if (a[i] == a[i + 1]) {
            delete(a[i]);
         // nElems--; // Not needed here. (You're already doing this in delete())
        }
    }

說了這么多,考慮使用Set來完成這個任務。 這就是 Java API 中有Set原因。 它會自動刪除重復的元素。

你應該試試這個。 在 JDK 中,我們有許多這樣的實用程序類。

public static void main(String[] args){

    Long [] a = {77l, 44l, 55l, 33l, 55l, 22l, 88l, 11l, 33l, 66l, 33l};

    Set<Long> set=new HashSet<>(Arrays.asList(a));
    System.out.println(set);
}

您遇到的一個問題是您調用nElems--; 兩次 - 一次在delete (這很公平)和一次在noDups ,在調用delete之后立即。 你應該刪除后者。

第二個問題是 Rohit 發現的問題。

我是編程新手,但請參閱下面的嘗試。 我認為它有效。

public void noDups(){       
  int i;
  int j;

  for(i = nElems-1;i>=0;i--){
     for(j = i-1;j>=0;j--){
        if(a[i]==a[j]){
            delete(a[j]);
        }
     }
  }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM