如何从具有重复值</object>的ArrayList <object>中删除重复项

时间:2014-04-25 12:04:49

标签: java arraylist

我有一个对象,例如

public class name{

int age;
localdatetime borndate; 

//getter/setters etc..

}

我获得了List<name>,按localdatetime顺序按desc排序。我想比较age变量ArrayList中的对象。如果其他年龄相同的人出现,则删除其他所有人并保留最新值。

e.g。 说我有以下数据集:

new name(13,12/02/2005)
new name(12,12/02/2004)
new name(13,12/02/2004)
new name(14,12/02/2004)

我希望

new name(13,12/02/2005)
new name(12,12/02/2004)
new name(14,12/02/2004)

我尝试使用嵌套循环但不确定这是否是最佳方法?

4 个答案:

答案 0 :(得分:0)

您可以使用第一个包含数组列表的方法来检查重复条目。如果找到则使用数组列表的删除方法。

答案 1 :(得分:0)

您可以序列化数据并将其放入HashSet,然后将其转换回ArrayList。

整数示例:

    ArrayList<Integer> ints = new ArrayList<Integer>();
    Random rand = new Random();
    for(int i = 0; i < 1000; ++i) {
        ints.add(rand.nextInt(100));
    }
    HashSet<Integer> set = new HashSet<Integer>();
    set.addAll(ints);
    ints.clear();
    ints.addAll(set);

不是最节省内存的方式(虽然它是O(N)),但是最容易阅读......

这是有效的,因为Set仅包含唯一值。在该片段的末尾, ints 将仅包含唯一值。

就像我建议的另一篇文章一样,使用LinkedHashSet来保留原始项目顺序。

答案 2 :(得分:0)

使用地图存储找到的条目,并执行检查是否已找到该年龄的任何内容,因为您只需要任何给定年龄的一个。由于您的数据已按您想要的顺序排序,因此请使用LinkedHashMap来保留排序顺序:

LinkedHashMap<Integer, name> data = new LinkedHashMap<Integer, name>();
for (name item: list) {
    Integer age = Integer.valueOf(name.age);
    if (!data.containsKey(age)) {
        data.put(age, name);
    }
}
return data.values();

答案 3 :(得分:0)

Java 8方法(实际使用Java代码):

public class Name {
    int age;
    Date borndate;

    public Name(int age, String borndate) throws ParseException {
        this.age = age;
        SimpleDateFormat sdf = new SimpleDateFormat("DD/MM/YYYY");
        this.borndate = sdf.parse(borndate);
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 59 * hash + this.age;
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Name other = (Name) obj;
        return this.age == other.age;
    }

    @Override
    public String toString() {
        return age + " : " + borndate;
    }

    public static void main(String[] args) throws ParseException {
        List<Name> l = Arrays.asList(new Name(13, "12/02/2005"), 
            new Name(12, "12/02/2004"), new Name(13, "12/02/2004"), 
            new Name(14, "12/02/2004"));
        l = l.stream().distinct().collect(Collectors.toList());
        System.out.println(l);
    }

}