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

标签 java arrays arraylist stringbuilder duplicates

我尝试使用HashSet删除 ArrayList<StringBuilder> 中的重复项。

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

"u12e5 u13a1 u1423"
"u145d"
"u12e5 u13a1 u1423"
"u3ab4 u1489"

我想要得到以下内容:

"u12e5 u13a1 u1423"
"u145d"
"u3ab4 u1489"

我当前的实现是:

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);
} 

但是随着 ArrayList 的出现,性能变得越来越差。尺寸变大。这个实现有什么问题吗?或者在性能方面你们有更好的吗?

最佳答案

StringBuilder 不实现 equals() 或 hashcode()。仅当两个 StringBuilder 是完全相同的对象时,它们才相等,因此将它们添加到 HashSet 中不会排除两个具有相同内容的不同 StringBuilder 对象。

您应该将 StringBuilder 转换为 String 对象。

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

最后,在添加对象之前没有必要在哈希集上调用 contains() 。只需将您的字符串添加到集合中,集合将拒绝重复项(并将返回 false)。

关于java - 在 Java 中,如何有效地从 ArrayList<StringBuilder> 中删除重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12900389/

相关文章:

JAVA:用于文档比较的最佳数据结构?

java - 原始数组与集合

java - 使用 float 创建累积数组

java - 创建负载平衡器失败原因 : Default VPC not found

java - vector 、点、战舰、2D

java - 使用 Graphics2D Area 的替代方案?

java - 为什么我无法更改此 BufferedImage?

iphone - 将 unsigned char 数组转换为 NSData 并返回

Android:如何解析对象数组的JSON数组

java - 为什么不打印 "println"消息?