Collections.sort不排序

时间:2015-05-29 12:23:34

标签: java sorting java-ee collections

我正在使用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;
&#13;
&#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;

6 个答案:

答案 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注释建议,在我的情况下我需要再次对不同的方法调用进行重新排序,所以这个解决方案适合我。