如何改进此方法以从ArrayList中删除重复项,以使其比O(n2)更有效

时间:2013-10-09 13:16:18

标签: java

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

修改

感谢大家的一致回答。我有一个问题。当我骑过它们时,哈希码和等于方法的内容是什么?

5 个答案:

答案 0 :(得分:5)

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

 return new ArrayList<Place>(new LinkedHashSet<Place>(masterList));

答案 1 :(得分:1)

您可以做的最好的事情是覆盖hashcodeequals方法并从列表中生成一个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对象定义了hashcodePlace,只需从arraylist创建HashSet,然后从set中创建arraylist。