在Java中,如何有效地从ArrayList <StringBuilder>中删除重复?

Jac*_*kWM 0 java arrays stringbuilder arraylist duplicate-removal

我试图用来HashSet删除重复ArrayList<StringBuilder>.

例如,这是一个ArrayList,每一行都是一个StringBuilder对象.

"u12e5 u13a1 u1423"
"u145d"
"u12e5 u13a1 u1423"
"u3ab4 u1489"
Run Code Online (Sandbox Code Playgroud)

我想得到以下内容:

"u12e5 u13a1 u1423"
"u145d"
"u3ab4 u1489"
Run Code Online (Sandbox Code Playgroud)

我目前的实施是:

static void removeDuplication(ArrayList<StringBuilder> directCallList) {
    HashSet<StringBuilder> set = new HashSet<StringBuilder>();
    for(int i=0; i<directCallList.size()-1; i++) {
        if(set.contains(directCallList.get(i)) == false)
            set.add(directCallList.get(i));
    }   
    StringBuilder lastString = directCallList.get(directCallList.size()-1);
    directCallList.clear();
    directCallList.addAll(set);
    directCallList.add(lastString);
} 
Run Code Online (Sandbox Code Playgroud)

但随着ArrayList规模的扩大,性能变得越来越差.这个实现有什么问题吗?或者你在表现方面有更好的表现吗?

Sam*_*num 9

StringBuilder没有实现equals()或hashcode().如果它们是完全相同的对象,则两个StringBuilder仅相等,因此将它们添加到HashSet将不会排除具有相同内容的两个不同的StringBuilder对象.

您应该将StringBuilders转换为String对象.

此外,您应该在构造函数中使用"初始容量"初始化HashSet.如果您处理大量对象,这将有助于提高速度.

最后,在添加对象之前,不必在hashset上调用contains().只需将你的字符串添加到集合中,集合将拒绝重复(并将返回false).