2011-12-10 73 views
3

如何在java中爲重複對象排序對象列表?基本上每個對象在排序後都應該在列表中排列。也許有人知道一個很好的例子。如何對重複對象列表進行排序

+0

你想 「之類的,然後刪除重複項」 或者僅僅是 「刪除重複」 就夠了嗎?如果不是,那麼「刪除重複然後排序」呢?例如。是否有一個特別的理由來排序第一(或根本) - 如果不是創建自己的重複卸妝,將相同價值的物品排序考慮在內? ;-)請相應地更新標題/問題。 – 2011-12-11 00:06:50

回答

4

您可以添加列表到集合中的元素,然後創建這些元素的新列表,像這樣:

List<Object> originalList = new ArrayList<Object>(); 
// the elements of originalList get added here 

Set<Object> set = new HashSet<Object>(originalList); 
List<Object> newList = new ArrayList<Object>(set); 

注意:

  • 我使用Object作爲列表和設置的類型,將其替換爲適合您需要的類型
  • 爲了使上述工作正常進行,列表中的對象必須覆蓋hashCodeequals
  • 在新的列表中的元素將在不同的順序不同於原始列表
2

要從列表中獲得唯一元素的集合,您可以將所有元素添加到Set

List<String> l = new ArrayList<String>(); 
Set<String> s = new HashSet<String>(l); 
+2

使用構造函數怎麼樣:HashSet(Collection c) –

+0

好點;相應編輯。 –

1

如果你只是想刪除重複的,試試這個:

List<Object> l; //Your list of data 

for(int i = l.size()-1; i > 0; i--) 
    for(int j = i; j > 0; j--) 
    if(l.get(i).equals(l.get(j))) //or == for primitives 
     l.remove(j); 

如果你想申請一個特定的排序,你可以在同一for循環中的if語句之後做到這一點。這是HashSet的唯一優勢。

+1

這不符合要求,因爲當您從列表l中刪除第j個元素時,所有更高的元素向下移動,您的索引就會混亂。當使用索引移除元素時,_always向後工作,例如, 'for(int i = l.size() - 1; i> = 0; i - )' – user949300

+0

我忘記了,現在編輯。 – Jon

+0

非常非常無效,你循環設置每個項目的集合,它有一組8個項目,即8 + 7 + 6 + 5 + 4 + 3 + 2 + 1或36,因爲你少做一個每一次),但是接着說你有24個項目......(298),每增加一個大小就增加最大數量,不是很快。 –

1

正如其他人已經指出的那樣,你可以用一組數據結構。但是,由於您正在尋找一個排序的列表,而不是使用HashSet,您可以去TreeSet,其默認情況下其元素按自然順序排序。

例如爲:

List<Integer> list = new ArrayList<Integer>(); 

list.add(8); 
list.add(5); 
list.add(3); 
list.add(5); 
list.add(9); 

Set<Integer> s = new TreeSet<Integer>(list); 

Iterator<Integer> itr = s.iterator(); 
while(itr.hasNext()) { 
    System.out.print(itr.next() + " "); 
} 

輸出:

+0

他希望排序的原因是這樣可以更輕鬆地刪除重複項。然而+1是唯一一個看起來像是閱讀整篇文章的人。 –

相關問題