我有两个列表results
和dateObj
。在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);
}
答案 0 :(得分:0)
摆脱重复的简单解决方案是使用一些辅助对象和一个Set。
让我们调用辅助对象ObjectContainer
它可以非常简单地只有两个字段string
和intValue
要在Set
中使用它,我们必须实施hashCode
和equals
。
为了轻松展示其内容,我们实施了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
可能会更好,但这取决于您。