【问题标题】:How to remove repeated element from list?如何从列表中删除重复的元素?
【发布时间】:2017-09-03 19:17:36
【问题描述】:

我有两个列表 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);
}

【问题讨论】:

  • 您的代码有问题:不可能将二元素对象数组放入List&lt;String&gt;。请发布真实代码,并尝试解释此代码应该做什么。要打印数组的内容,请使用Arrays.toString(...) - 你不能使用数组的名称,因为数组没有toString 方法。
  • 我强烈建议不要使用旧的 java.util.Datejava.util.Calendar 类。您应该改用 java.time 包中的适当类。
  • 您应该很少遇到需要在代码中键入单词“Object”的情况。如果你这样做了,停下来问问你是否在使用强类型语言做错了什么。
  • 另外,你在这里问了两个问题。在同一个问题中提出多个不相关的问题是不好的形式。如果您需要两个问题的答案,请将其分成两个不同的问题。
  • @RealSkeptic 无法将二元素对象数组放入 List,我该怎么办?

标签: java list jpa collections


【解决方案1】:

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

让我们调用辅助对象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,但这留给您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-05
    • 2012-05-09
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多