我有重複號的ArrayList
:打印元件
1
2
3
1
2
4
我想要做的是有程序的打印1,2,3,4
而忽略已打印的整數。
我通常的做法是使用for循環遍歷ArrayList,但我正在努力阻止重複的元素。我在想某種計數器系統可能會在這裏工作,但我不確定如何實現它,所以任何幫助將不勝感激。
我有重複號的ArrayList
:打印元件
1
2
3
1
2
4
我想要做的是有程序的打印1,2,3,4
而忽略已打印的整數。
我通常的做法是使用for循環遍歷ArrayList,但我正在努力阻止重複的元素。我在想某種計數器系統可能會在這裏工作,但我不確定如何實現它,所以任何幫助將不勝感激。
你可以用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雖然,考慮到這種行爲會推廣到所有列表,你可以縮短你的例子到'列表
@鄧肯感謝,你的方式更優雅。 – Mena 2014-08-28 11:50:00
當你迭代和打印,積累要素在HashSet
,測試的add
返回值:
if (set.add(item)) printItem(item);
如果順序不重要的,隱蔽的列表爲一組,然後打印出來。
否則,例如在遍歷過程中維護第二個列表,如果它之前沒有出現並將其添加,則將其添加到它並打印出來,如果它在清單中,則跳過它。
你聽說過'LinkedHashSet'嗎?我想這就是你想要建議的。 – 2014-08-28 11:44:14
首先轉換列表進行設置然後打印。如果訂單不重要,那麼您可以使用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
即可訂購。
爲什麼不使用一組來避免重複? – Athanor 2014-08-28 11:43:10
http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashSet.html – 2014-08-28 11:43:23
'HashSet'本身就是一個糟糕的選擇,'LinkedHashSet'更好。至少如果你打算使用'addAll()'。 – biziclop 2014-08-28 11:44:17