我尝试使用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/