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中。