过滤重复的java列表并修改

时间:2017-11-24 23:24:45

标签: java

我有一个arraylist:

List<MissingIdentifier> missing = new Arraylist<MissingIdentifier>();

该实体如下所示:

    public class MissingIdentifier {    
    protected String Identifier;   
    protected Date from;    
    protected Date to;
}

当我将集合转换为csv时,它会像这样出现:

IDENTIFIER,FROM,TO
IDENTIFIER1,22/11/2017,22/11/2017
IDENTIFIER1,22/11/2017,22/11/2017
IDENTIFIER1,14/11/2017,14/11/2017
IDENTIFIER1,14/11/2017,14/11/2017
IDENTIFIER2,16/11/2017,16/11/2017
IDENTIFIER2,16/11/2017,16/11/2017

是否有可能在转换arraylist时轻松做一些事情,以便它只为每个标识符提供一个项目,但是包括最小日期作为'from',最大日期作为每个标识符的'to'(获取)摆脱所有重复):

    IDENTIFIER,FROM,TO
    IDENTIFIER1,14/11/2017,22/11/2017
    IDENTIFIER2,16/11/2017,16/11/2017

我很想知道如何使用SQL轻松实现这一点,但我不打算坚持这个实体。

3 个答案:

答案 0 :(得分:2)

要防止重复,只需覆盖equalshashCode方法,然后将您的商品添加到Set

我建议你阅读Set interface以及实现它的类。

我刚刚在Eclipse中快速生成了使用您班级中所有字段的toStringequalshashCode方法:

public class MissingIdentifier {    
    protected String identifier;   
    protected Date from;    
    protected Date to;

    public String getIdentifier() {
        return identifier;
    }

    public void setIdentifier(String identifier) {
        this.identifier = identifier;
    }

    public Date getFrom() {
        return from;
    }

    public void setFrom(Date from) {
        this.from = from;
    }

    public Date getTo() {
        return to;
    }

    public void setTo(Date to) {
        this.to = to;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((from == null) ? 0 : from.hashCode());
        result = prime * result + ((identifier == null) ? 0 : identifier.hashCode());
        result = prime * result + ((to == null) ? 0 : to.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        MissingIdentifier other = (MissingIdentifier) obj;
        if (from == null) {
            if (other.from != null)
                return false;
        } else if (!from.equals(other.from))
            return false;
        if (identifier == null) {
            if (other.identifier != null)
                return false;
        } else if (!identifier.equals(other.identifier))
            return false;
        if (to == null) {
            if (other.to != null)
                return false;
        } else if (!to.equals(other.to))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "MissingIdentifier [identifier=" + identifier + ", from=" + from + ", to=" + to + "]";
    }
}

现在我能够做到这一点:

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class DuplicateRemoveExample {

    public static void main(String[] args) {
        Date now = new Date();

        MissingIdentifier id1 = new MissingIdentifier();
        id1.setTo(now);
        id1.setFrom(now);
        id1.setIdentifier("abc");

        MissingIdentifier id2 = new MissingIdentifier();
        id2.setTo(now);
        id2.setFrom(now);
        id2.setIdentifier("abc");

        Set<MissingIdentifier> mySet = new HashSet<>();
        mySet.add(id1);
        mySet.add(id2);

        System.out.println(mySet);
    }

}

并且输出只显示集合中的单个项目:

[MissingIdentifier [identifier=abc, from=Fri Nov 24 19:40:36 CST 2017, to=Fri Nov 24 19:40:36 CST 2017]]

最后,您可能会注意到我已将实例变量的名称从Identifier更改为identifier。这符合Java Naming Conventions。请学习它们并使用它们,因为它可以帮助其他人更轻松地阅读您的代码。

答案 1 :(得分:0)

这是最简单的算法:根据您的唯一性需求创建一个具有键值的空HashMap。然后循环输入对象,并构建地图。然后,您需要在输入数组上进行另一个循环,以生成对所有数据都完整的最大/最小值。您不需要编写任何自定义地图或覆盖任何等于方法或任何方法。发布的其他解决方案通常很容易让这很难。

答案 2 :(得分:-2)

你需要@override equals和toString方法 然后你就可以通过Collection来获得重复:)

1

2

3

4

5

}