如何从列表中删除重复的元素?

时间:2017-04-08 13:06:23

标签: java list jpa collections

我有两个列表resultsdateObj。在dateObj列表中,我添加了两个日期之间的月份,另一个列表包含月份列表,因此我应该从dateObj列表中删除重复的月份。

这是我的尝试:

public void nbreRep(ActionEvent e) {
    List<Object[]> results;
    List<String> dateObj = new ArrayList<String>();
    Date date_de;
    Date date_a;
    Calendar beginCalendar = Calendar.getInstance();
    Calendar finishCalendar = Calendar.getInstance();
    beginCalendar.setTime(date_de);
    finishCalendar.setTime(date_a);
    while (beginCalendar.before(finishCalendar)) {
        Date datediff = beginCalendar.getTime();
        beginCalendar.add(Calendar.MONTH, 1);
        fC = Calendar.getInstance();
        Calendar fCa = Calendar.getInstance();
        fC.setTime(datediff);
        fCa.setTime(datediff);
        int year = fCa.get(Calendar.YEAR);
        String d = fC.getDisplayName(fC.MONTH, fC.LONG, Locale.FRANCE) + " " + year;
        Object[] obj = new Object[2];
        obj[0] = d;
        obj[1] = 1;
        dateObj.add(obj);
    }
    for (int i = 0; i < dateObj.size(); i++) {
        System.out.println("index " + i + "value " + dateObj.get(i));
    }
    Query query = entityManager.createQuery("select r.dateheurerep, count(r) as nbrr "
                    + "  from Reparation r "
                    + " where r.dateheurerep >= :date_de "
                    + "   and r.dateheurerep <= :date_a "
                    + " GROUP BY YEAR(r.dateheurerep), MONTH(r.dateheurerep)");
    query.setParameter("date_de", date_de);
    query.setParameter("date_a", date_a);
    results = query.getResultList();
    results.addAll(dateObj);
}

1 个答案:

答案 0 :(得分:0)

摆脱重复的简单解决方案是使用一些辅助对象和一个Set。

让我们调用辅助对象ObjectContainer 它可以非常简单地只有两个字段stringintValue

要在Set中使用它,我们必须实施hashCodeequals。 为了轻松展示其内容,我们实施了toString方法。

要使其可转换为Object[],它有toObjectArray方法。

final class ObjectContainer {
    public String string;
    public int intValue;

    public ObjectContainer(String string, int intValue) {
        this.string = string;
        this.intValue = intValue;
    }

    public boolean equals(Object obj) {
        if (obj == null) return false;
        if (obj == this) return true;
        if (obj.getClass() != this.getClass()) return false;
        ObjectContainer other= (ObjectContainer)obj;
        if (string == null) return other.string == null; 
        return other.intValue == intValue && string.equals(other.string);
    }

    public String toString() {
        return "ObjectContainer[" + string + "," + intValue + "]";
    }

    public Object[] toObjectArray() {
        return new Object[]{string, intValue};
    }

    public int hashCode() {
        return 3 * intValue + 7 * (string != null ? string.hashCode() : 0);
    }
}

为了能够将ObjectContainer集合的所有元素添加到Object[]的列表中,我们实现了一些帮助

public static List<Object[]>addAll(List<Object[]> list, Collection<ObjectContainer> c) {
    List<Object[]> result = list;
    if (list == null ) {
        result = new ArrayList<>();
    }

    for (ObjectContainer cont : c) {
        result.add(cont.toObjectArray());
    }
    return result;
} 

当我们想要使用它时,我们会做类似的事情:

    HashSet<ObjectContainer> set = new HashSet<>();
    set.add(new ObjectContainer("test", 1));

HashSet确保每个元素只出现一次。

要将元素添加到我们编写的结果列表中:

    List<Object[]> results = new ArrayList<>();

    addAll(results, set);

将结果列表添加到Set可能会更好,但这取决于您。