【发布时间】:2011-01-15 04:21:50
【问题描述】:
我从文本文件中读取数据,所以可能有:
约翰 玛丽 约翰 利兹我现在需要在 ArrayList 中获取 3 个唯一元素,因为文件输出中只有 3 个唯一值(如上)。
我可以使用 HashTable 并向其添加信息,然后简单地将其数据复制到列表中。 还有其他解决方案吗?
【问题讨论】:
标签: java collections arraylist
我从文本文件中读取数据,所以可能有:
约翰 玛丽 约翰 利兹我现在需要在 ArrayList 中获取 3 个唯一元素,因为文件输出中只有 3 个唯一值(如上)。
我可以使用 HashTable 并向其添加信息,然后简单地将其数据复制到列表中。 还有其他解决方案吗?
【问题讨论】:
标签: java collections arraylist
List<String> distinctElements = list.stream()
.distinct().filter(s -> s != null && s != "")
.collect(Collectors.toList());
这将收集不同的项目并避免 null 或空字符串
【讨论】:
另一种方法是使用 Java 8 流的 distinct
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
// public static void main(String args[]) ...
// list of strings, including some nulls and blanks as well ;)
List<String> list = Arrays.asList("John", "Mary", "John", "Leeds",
null, "", "A", "B", "C", "D", "A", "A", "B", "C", "", null);
// collect distinct without duplicates
List<String> distinctElements = list.stream()
.distinct()
.collect(Collectors.toList());
// unique elements
System.out.println(distinctElements);
输出:
[John, Mary, Leeds, null, , A, B, C, D]
【讨论】:
class HashSetList<T extends Object>
extends ArrayList<T> {
private HashSet<Integer> _this = new HashSet<>();
@Override
public boolean add(T obj) {
if (_this.add(obj.hashCode())) {
super.add(obj);
return true;
}
return false;
}
}
我现在将这种结构用于小程序,我的意思是您几乎不需要开销即可拥有 getter 和 setter,但具有唯一性。此外,您可以覆盖hashCode 来决定您的项目是否等于另一个。
【讨论】:
我是这样解决的:
import groovy.io.*;
def arr = ["5", "5", "7", "6", "7", "8", "0"]
List<String> uniqueList = new ArrayList<String>(new HashSet<String>( arr.asList() ));
System.out.println( uniqueList )
【讨论】:
如果您有一个包含重复项的 List,而您想要一个不包含重复项的 List,您可以这样做:
List<String> newList = new ArrayList<String>(new HashSet<String>(oldList));
也就是说,将旧列表包装成一个集合以删除重复项并将该集合再次包装在一个列表中。
【讨论】:
newList的排序会和oldList的排序一样,或者?
LinkedHashSet 而不是 HashSet,您将保留订单。
使用set 而不是列表。看看这里:Java Collections Tutorials,特别是关于这里的集合:Java Sets Tutorial
简而言之,集合包含某物之一。完美:)
【讨论】:
为什么需要将其存储在List 中?您是否确实需要对数据进行排序或支持基于索引的查找?
我建议将数据存储在Set 中。如果订购不重要,您应该使用HashSet。但是,如果您希望保留订单,可以使用 LinkedHashSet。
【讨论】:
List 既不必要又效率较低(O(n^2) vs O(n))。除非您确实需要保留Strings 的顺序,否则在实践中使用List 确实是一个更糟糕的选择。 for(;;) 的情况并非如此。可能使用List 对您来说更自然,因为C 并没有像Set 这样的数据结构,但使用起来确实不是很自然。
添加前可以查看list.contains()。
if(!list.contains(value)) {
list.add(value);
}
我猜这很明显!但是,将项目添加到 HashSet,然后从该集合创建列表会更有效。
【讨论】: