2014-08-28 27 views
-2

我有重複號的ArrayList打印元件

1 
2 
3 
1 
2 
4 

我想要做的是有程序的打印1,2,3,4而忽略已打印的整數。

我通常的做法是使用for循環遍歷ArrayList,但我正在努力阻止重複的元素。我在想某種計數器系統可能會在這裏工作,但我不確定如何實現它,所以任何幫助將不勝感激。

+0

爲什麼不使用一組來避免重複? – Athanor 2014-08-28 11:43:10

+1

http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashSet.html – 2014-08-28 11:43:23

+1

'HashSet'本身就是一個糟糕的選擇,'LinkedHashSet'更好。至少如果你打算使用'addAll()'。 – biziclop 2014-08-28 11:44:17

回答

3

你可以用Set輕鬆做到這一點,而且不需要迭代。

  • ,如果你想保持自然秩序
  • 使用LinkedHashSet使用TreeSet,如果你想保持插入順序

List<Integer> numbers = Arrays.asList(2,1,3,3,4,1,2,5); 
System.out.printf("Natural ordering: %s%n", new TreeSet<Integer>(numbers)); 
System.out.printf("Ordering based on insertion order: %s%n", new LinkedHashSet<Integer>(numbers)); 

輸出

Natural ordering: [1, 2, 3, 4, 5] 
Ordering based on insertion order: [2, 1, 3, 4, 5] 
+1

+1雖然,考慮到這種行爲會推廣到所有列表,你可以縮短你的例子到'列表 numbers = Arrays.asList(2,1,3,3,4,1,2,5);'。 – 2014-08-28 11:48:29

+0

@鄧肯感謝,你的方式更優雅。 – Mena 2014-08-28 11:50:00

5

當你迭代和打印,積累要素在HashSet,測試的add返回值:

if (set.add(item)) printItem(item); 
0

如果順序不重要的,隱蔽的列表爲一組,然後打印出來。
否則,例如在遍歷過程中維護第二個列表,如果它之前沒有出現並將其添加,則將其添加到它並打印出來,如果它在清單中,則跳過它。

+1

你聽說過'LinkedHashSet'嗎?我想這就是你想要建議的。 – 2014-08-28 11:44:14

0

首先轉換列表進行設置然後打印。如果訂單不重要,那麼您可以使用HashSet

List<Integer> list = new ArrayList<>(); 
    list.add(1); 
    list.add(2); 
    list.add(3); 
    list.add(1); 
    Set<Integer> set = new HashSet<>(list); 
    for(Integer number : set){ 
     System.out.println(number); 
    } 

這將只打印唯一的數字。

只需更換爲TreeSet即可訂購。