我正在使用Java EE构建Web应用程序(尽管我的问题更基于Java)
在Servlet中,我收到了EJB的订单列表。在此订单列表中,有一个此订单的状态列表(已发送,已停靠,未收到...)
我想按州的日期对这份州名单进行排序。所以我像这样使用Collections.sort:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "ciiCommande")
private List<Etat> etatList;
@XmlTransient
public List<Etat> getEtatList() {
return etatList;
}
List<Commande> commandes = new ArrayList<Commande>();
&#13;
但是当我显示结果时,状态不会被排序。
我试图扭转顺序,但你也看不到。
正如您所看到的,我用ListIWantToSort.sort替换了Collections.sort。还是行不通。
关于它为什么不起作用或我如何修复它的任何想法?
编辑:这是列表及其实例的获取者:
<c:forEach items="${commandes}" var="cmd">
<td>${cmd.etatList[0].codeStatut.libelleSituation}</td>
</c:forEach>
我通过findAll方法获取命令。
要显示它们,我使用它:
EXEC SQL INCLUDE sqlca.h;
EXEC SQL INCLUDE oraca.h;
EXEC SQL INCLUDE sqlcpr.h;
答案 0 :(得分:2)
尝试:
for (Commande c : commandes) {
c.getEtatList().sort(Collections.reverseOrder(new Comparator<Etat>() {
@Override
public int compare(Etat o1, Etat o2) {
return o1.getDateEtat().compareTo(o2.getDateEtat());
}
}));
}
由于您使用的sort方法已被添加到Java SE 8中的List接口,我猜您正在使用Java SE 8.然后您可以将其重写为以下内容:
commandes.foreach(c ->
c.getEtatList().sort(Comparator.comparing(Etat::getDateEtat).reversed());
);
答案 1 :(得分:2)
您首先使用自定义比较器对列表进行排序。然后,您将根据元素的反向自然顺序对其进行重新排序 - 而不是您已应用的自定义排序。所以第一种排序没有生效,因为列表按第二种排序重新排序。请注意,Collections.reverseOrder()
不反转列表 - 它与自然排序相反(因此getEtatList()
中的元素必须已经Comparable
1}})。
尝试丢失第二种并执行:
c.getEtatList().sort(new Comparator<Etat>() {
@Override
public int compare(Etat o1, Etat o2) {
// Note o2/o1 reversed.
return o2.getDateEtat().compareTo(o1.getDateEtat());
}
});
答案 2 :(得分:1)
这应该是你需要的:
model
答案 3 :(得分:0)
这可以按预期工作,您的问题出在其他地方:
public static void main(String[] args) {
List<State> states = Arrays.asList(new State(2015, 1, 1),
new State(2014, 1, 1),
new State(2016, 1, 1));
System.out.println(states); //not ordered
states.sort(new Comparator<State>() {
@Override public int compare(State o1, State o2) {
return o1.getStateDate().compareTo(o2.getStateDate());
}
});
System.out.println(states); //ordered
}
public static class State {
private final LocalDate stateDate;
public State(int year, int month, int day) {
this.stateDate = LocalDate.of(year, month, day);
}
public LocalDate getStateDate() { return stateDate; }
@Override public String toString() { return stateDate.toString(); }
}
请注意,您似乎正在使用Java 8并且可以编写比较器:
states.sort(comparing(State::getStateDate));
答案 4 :(得分:0)
在我每次尝试之后,列表都没有排序。我还是不知道为什么。
但是我发现了一个注释@OrderBy,它按照我想要的方式对列表进行排序。
谢谢大家的帮助,也许有一天这个问题会被解决(看到双关语?我好笑)。
干杯
答案 5 :(得分:0)
我很感激你的问题,因为我刚刚经历过这个问题。我实施了“可比较的”#39; (正如我在其他时候做过的很多次)在我的JPA实体课上。在myMainJPA_Object.getMyList()上执行Collections.sort时,不会调用overriden equivalent方法。
我的解决方法是创建一个新的List作为ArrayList(例如),执行.addAll(myObject.getMyList()),然后在该新列表上执行Collections.sort,然后排序工作(我的可比方法在排序上被调用)。例如:
List<ObjectsToSort> tempList = new ArrayList<>();
tempList.addAll(jpaEntity.getListOfStuff());
Collections.sort(tempList);
//Then you could set the list again
jpaEntity.setListOfStuff(tempList);
我真的不喜欢这个解决方案,但我不知道其他任何方式,并且没有发现任何关于这个问题(直到你的帖子)。我喜欢你的@OrderBy注释建议,在我的情况下我需要再次对不同的方法调用进行重新排序,所以这个解决方案适合我。