2013-03-11 74 views
1

我犯了這個錯誤。我認爲這是錯誤的。數組中沒有冗餘的顯示元素

public void display() { 
    for (int i = 0; i < tabT.length; i++) 
     if (tabT[i] != null) 
      for (int j = 0; j <= i; j++) 
       if (tabT[i] != tabT[j]) 
        System.out.println(tabT[i].getCar()); 
} 

如何在數組中顯示沒有冗餘的元素?

回答

1

如果你只想使用數組,你可以這樣做:

做一個臨時(輔助)陣列,其中包括在tabT迄今爲止看到的每一個元素。然後,在打印該值之前,檢查它是否沒有出現在幫助程序數組(tmp)中。

例如,如果您有值tabT,你不希望打印的每一個不止一次:

int[] tabT = {1,2,3,1,1,2,6,7,2,7,1}; 
int[] tmp = new int[tabT.length]; 
boolean flag; 
for (int i = 0; i < tabT.length; i++) { 
    tmp[i] = tabT[i]; 
    flag = true; 
    for (int j = 0; j < tmp.length; j++) 
     if (tabT[i] == tmp[j] && i!=j) { 
      flag = false; 
     } 
    if(flag) 
     System.out.println(tabT[i]); 
} 

輸出:[1,2,3,6,7]

您可以將這個想法很容易地應用到你的程序,你就會有每個元素打印一次:

Cars[] tmp = new Cars[tabT.length]; //Assuming tabT is from type Cars[] 
boolean flag = true; 
for (int i = 0; i < tabT.length; i++) { 
    tmp[i] = tabT[i]; 
    if (tabT[i] != null) { 
     for (int j = 0; j < tmp.length; j++) 
      if (tabT[i].getCar().equals(tabT[j].getCar()) && i!=j) 
       flag = false; 
     if(flag) 
      System.out.println(tabT[i].getCar()); 
    } 
} 

這將打印每節車廂(或任何你打印)只有一次。

+0

謝謝,但是「tmp」在這裏不是空嗎?我怎樣才能刪除這個數組呢? – mpluse 2013-03-11 20:49:29

+0

我編輯了我的答案 – Maroun 2013-03-11 20:50:33

+0

這裏有個問題 if(tabT [i] .getCar( ).equals(tabT [j] .getCar())&& i!= j) – mpluse 2013-03-11 21:05:50

0

將tabT數組放入Set中。將不會有重複的項目。

Set tabTList = new HashMap(Listjava.util.Arrays.asList(tabT); 
+0

在練習中,我應該在數組中有重複的項目,但是當我顯示它們時,它應該沒有冗餘。 – mpluse 2013-03-11 20:31:47

+0

@mpluse:你總是可以轉換爲一個集合來刪除重複項並保留原始集合完好無損 – 2013-03-11 20:32:14

0

如果你想跟蹤重複計數,你可以考慮一個HashMap。迭代一次數組以將對象放置到HashMap中,並使用它們各自的計數。然後再次遍歷數組,再次檢查HashMap。這將是O(n)的時間,而不是潛在的爲O(n^2)

1

對象經由equals()相比例如

if (!tabT[i].equals(tabT[j])) 

您沒有比較的參考值的對象

for (int i=0; i< tabT.length; i++) { 
    boolean f = false; 
    for (int j=i+1; j <tabT.length; j++) 
    if (tabT[i].equals(tabT[j])) { 
     f=true; 
     break; 
    } 
    if (!f) 
    System.out.println(tabT[i].getCar()); 
} 

這應該會給你所有組合非重複的ij,所以我們不會多次比較它們。

+0

這將仍然打印每個項目不止一次(如果它出現多次..) – Maroun 2013-03-11 20:52:49

+0

不工作:( – mpluse 2013-03-11 20:55:50

+0

@mpluse現在看 – 2013-03-11 21:21:05

0

==!=在對象級別測試相等性(即,如果兩個實例相同)。您需要的是比較每個對象所表示的值(例如,如果兩個字符串相等),那麼您需要詢問是否!tabT[i].equals(tabT[j]),並使tabT的元素實現equals)。

或者將數組轉換爲一個集合,以刪除重複項。我使用了LinkedHashSet,因爲它保留了數組中元素的順序。請注意,您需要實施equalshashcode

0

爲什麼不嘗試這樣的事情? (我假設您正在使用字符串類型的工作)

HashSet<String> hashSet = new HashSet<String>(); 

for (int i = 0; i < tabT.length; i++) { 
    hashSet.add(tabT[i]); 
} 

你不能有重複的爲一組,所以現在你可以遍歷集合來獲得的唯一身份。

java.util.Iterator<String> iterator = hashSet.iterator(); 

while (iterator.hasNext()) { 
    System.out.println((String)iterator.next()); 
}