在ArrayList中保存唯一字符串列表

Eug*_*neP 37 java collections arraylist

我从文本文件中读取数据,因此可能有:

John
Mary
John
Leeds

我现在需要在ArrayList中获得3个唯一元素,因为文件输出中只有3个唯一值(如上所述).

我可以使用HashTable并向其添加信息,然后只需将其数据复制到List中.还有其他解决方案吗?

Ada*_*ski 76

你为什么要把它存放在一个List?您是否确实需要订购数据或支持基于索引的查找?

我建议将数据存储在Set.如果订购不重要,您应该使用HashSet.但是,如果您希望保留订购,则可以使用LinkedHashSet.

  • @EugeneP:不要用Java编写C代码.在每种语言中,最好利用自己的功能. (8认同)
  • @EugeneP:我不同意返回List比任何其他类型更好.最好返回适当的数据结构.如果唯一性很重要但排序不是那么返回一个Set.如果两者都不重要,则返回集合.如果您只想迭代元素,则返回Iterable.调用代码与内部实现的分离越多,就越容易在不同的实现中进行更改或替换. (7认同)
  • @EugeneP:我想你的观点是没有理由使用某些东西来符合教条.我不同意.但在这种情况下,`List`既不必要又效率较低(O(n ^ 2)vs O(n)).除非你真的需要保留`String`s的顺序,否则使用`List`实际上是一个更糟糕的选择.对于for(;;)`而言,情况并非如此.可能是因为使用"List"对你来说更自然,因为C实际上没有像数据结构那样的"Set",但它实际上并不是很自然的东西. (2认同)

Fab*_*eeg 67

如果你有一个List包含副本,并且你想要一个List没有,你可以这样做:

List<String> newList = new ArrayList<String>(new HashSet<String>(oldList));
Run Code Online (Sandbox Code Playgroud)

也就是说,将旧列表包装到一个集合中以删除重复项并再次将该集合包装在列表中.

  • 好的我找到了我的评论的答案:如果你使用`LinkedHashSet`而不是`HashSet`,你保留了顺序. (8认同)

Cha*_*kar 17

您可以在添加之前检查list.contains().

if(!list.contains(value)) {
    list.add(value);
}
Run Code Online (Sandbox Code Playgroud)

我猜这很明显!但是,将项添加到HashSet然后从该集创建列表将更有效.


Tom*_*ing 5

使用 aset而不是列表。请看这里:Java Collections 教程,特别是关于集合的内容:Java Sets 教程

简而言之,集合包含某物之一。完美的 :)