此方法从列表中删除具有相同地址字段的重复对象。它现在对我有用。但我正在升级我的应用程序,我期待我的ArrayLists变得更大。 (200多个对象)
我担心比较200条记录可能太慢了,因为它是O(n2)
我该如何改进呢。
public static ArrayList<Place> removeDuplicates(ArrayList<Place> masterList) {
ArrayList<Place> tempList = new ArrayList<Place>(masterList);
for (int i = 0; i < tempList.size(); i++) {
String address = tempList.get(i).getAddress();
for (int j = 0; j < tempList.size(); j++) {
String address2 = tempList.get(j).getAddress();
if (address.equalsIgnoreCase(address2) && i != j) {
tempList.remove(tempList.get(j));
}
}
}
return tempList;
}
修改
感谢大家的一致回答。我有一个问题。当我骑过它们时,哈希码和等于方法的内容是什么?
答案 0 :(得分:5)
确保实例生成良好的哈希码并使用HashSet
或LinkedHashSet
(如果您想保留顺序):
return new ArrayList<Place>(new LinkedHashSet<Place>(masterList));
答案 1 :(得分:1)
您可以做的最好的事情是覆盖hashcode
和equals
方法并从列表中生成一个Set。
通过这种方式,java可以删除列表中的重复元素,而不是你。
答案 2 :(得分:1)
public static ArrayList<Place> removeDuplicates(ArrayList<Place> masterList) {
Set<Place> temp = new HashSet<Place>();
for(Place place : masterList) {
if(!temp.add(place)) {
masterList.remove(place);
}
}
return masterList;
}
答案 3 :(得分:1)
你的地方名单
List<Place> masterList = new ArrayList<Place>();
masterList.add(new Place());
masterList.add(new Place());
masterList.add(new Place());
通过添加设置“s”
来删除重复项 Set<Place> s = new TreeSet<Place>(new Comparator<Place>() {
@Override
public int compare(Place o1, Place o2) {
return o1.getAddress().compareToIgnoreCase(o2.getAddress());
}
});
s.addAll(masterList);
打印结果
List<Object> res = Arrays.asList(s.toArray());
for (Object object : res) {
Place place = (Place)object;
}
答案 4 :(得分:0)
如果您为equals
对象定义了hashcode
和Place
,只需从arraylist创建HashSet
,然后从set中创建arraylist。