Java 从大型数据集中获取副本的最佳性能方式是什么<;字符串>;?
我有一个很大的Java 从大型数据集中获取副本的最佳性能方式是什么<;字符串>;?,java,set,duplicates,Java,Set,Duplicates,我有一个很大的集合,包含很多单词,比如: “aaa,cCc,dDD,aaa,bbB,bbB,aaa,cCc,…” 我想对集合中的所有重复单词进行分组,忽略单词的大小写敏感度,然后将它们保存在向量或任何东西中,这样每个向量项将包含一组类似的单词,如下所示: Vector:aaa,aaa,aaa,… Vector:cCc,cCc,… Vector:bbB,bbB,… 我关心的性能,因为这一套包含许多字 如果您真正关心性能,您就不会使用Vector。至于排序问题,一个解决方案是使用TreeMap或Tr
集合
,包含很多单词,比如:
“aaa,cCc,dDD,aaa,bbB,bbB,aaa,cCc,…”
我想对集合中的所有重复单词进行分组,忽略单词的大小写敏感度,然后将它们保存在向量
或任何东西中,这样每个向量
项将包含一组类似的单词,如下所示:
Vector
:aaa,aaa,aaa,…
Vector
:cCc,cCc,…
Vector
:bbB,bbB,…
我关心的性能,因为这一套包含许多字 如果您真正关心性能,您就不会使用
Vector
。至于排序问题,一个解决方案是使用TreeMap
或TreeSet
对象,并创建一个比较器
,以实现所需的相等(排序)
实例化可以是:
new TreeMap<String,LinkedList<String>>(new Comparator<String>() {
// comparator here
});
newtreemap(newcomparator(){
//比较器
});
用法:
LinkedList<String> entry = map.get(nextKey);
if (entry == null) {
entry = new LinkedList<String>()
map.put(nextKey, entry);
}
entry.add(nextKey);
LinkedList entry=map.get(nextKey);
if(条目==null){
entry=newlinkedlist()
map.put(nextKey,entry);
}
entry.add(nextKey);
我将创建一个HashMap HashMap
。
接下来,对于集合中的每个“字符串”
if (!hashMap.containsKey(string.toLowerCase()){
Vector v = new Vector();
v.add(string);
hashMap.put(string.toLowerCase(), v);
} else {
hashMap.get(string.toLowerCase()).add(string);
}
最后,如果需要,创建一个向量向量,或者使用hashmap.valueSet()如果可以选择
Set
实现,则可以使用TreeSet
和Comparator
比较字符串大小写。然后,您将能够在排序列表上进行迭代,并轻松地对重复项进行分组。这将在输入集上迭代一次,我怀疑您的速度会比这快得多。将ArrayList
s替换为LinkedList
可能会用本地性换取更少的复制,这可能是一种性能提升,但我对此表示怀疑。代码如下:
Set<String> input = new HashSet<String>(Arrays.asList(
"aaa", "cCc", "dDD", "AAA", "bbB", "BBB", "AaA", "CCc"));
Map<String, List<String>> tmp = new HashMap<String, List<String>>();
for (String s : input) {
String low = s.toLowerCase();
List<String> l = tmp.get(low);
if (l == null) {
l = new ArrayList<String>();
tmp.put(low, l);
}
l.add(s);
}
final List<List<String>> result = new ArrayList<List<String>>(tmp.values());
Set input=new HashSet(Arrays.asList(
“aaa”、“cCc”、“dDD”、“aaa”、“bbB”、“bbB”、“aaa”、“cCc”);
Map tmp=newhashmap();
for(字符串s:输入){
String low=s.toLowerCase();
列表l=tmp.get(低);
if(l==null){
l=新的ArrayList();
tmp.put(低,l);
}
l、 添加(s);
}
最终列表结果=新的ArrayList(tmp.values());
1/您事先知道目标字符串的完整列表吗?2/为什么要使用Vector而不是ArrayList或LinkedList?当值“添加”到集合中时,是否可以替换“Set”实现将其排序到内部结构中。我意识到这不是你所要求的,但似乎切换你的集合实现可能会使这更容易。“我关心性能,因为这个集合包含很多单词。”你是否足够关心在它上运行探查器,或者你只是在猜测?如果你关心性能,不要使用线程安全向量;请改用ArrayList或HashSet。非常感谢。。。我已经做了一些更改,比如在集合中的一些单词没有重复的情况下,所以不需要将它们添加到HashMap中。