0

此方法从具有相同地址字段的列表中删除重复对象。它目前对我有用。但我正在升级我的应用程序,我希望我的 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;
}

编辑

感谢大家的一致回答。我有一个最终问题。当我覆盖它们时,hashcode 和 equals 方法中有什么?

4

5 回答 5

5

确保实例产生良好的哈希码并使用HashSetor LinkedHashSet(如果您想保留顺序):

 return new ArrayList<Place>(new LinkedHashSet<Place>(masterList));
于 2013-10-09T13:20:49.210 回答
1

您能做的最好的事情就是覆盖hashcodeand equals方法并从您的列表中生成一个 Set。

通过这种方式,Java 负责删除列表中的重复元素,而不是您。

于 2013-10-09T13:19:50.457 回答
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;
}
于 2013-10-09T13:22:24.063 回答
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;

    }
于 2013-10-09T13:33:57.423 回答
0

如果你有equalshashcodePlace对象定义,只需HashSet从arraylist创建,然后从set创建arraylist。

于 2013-10-09T13:19:41.597 回答