[英]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.