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规模的扩大,性能变得越来越差.这个实现有什么问题吗?或者你在表现方面有更好的表现吗?
StringBuilder没有实现equals()或hashcode().如果它们是完全相同的对象,则两个StringBuilder仅相等,因此将它们添加到HashSet将不会排除具有相同内容的两个不同的StringBuilder对象.
您应该将StringBuilders转换为String对象.
此外,您应该在构造函数中使用"初始容量"初始化HashSet.如果您处理大量对象,这将有助于提高速度.
最后,在添加对象之前,不必在hashset上调用contains().只需将你的字符串添加到集合中,集合将拒绝重复(并将返回false).