我有重复号的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