2014-08-28 72 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即可订购。