2015-05-29 3 views
1

Я создания веб-приложений с использованием Java EE (хотя моя проблема более Java на основе)Collections.sort не сортировать

В Servlet, я получаю список заказов от EJB. В этом списке заказов есть список состояний для этого заказа (отправлено, на док-станцию, не получено ...)

Я хочу отсортировать этот список состояний по дате состояния. Поэтому я использую Collections.sort так:

for (Command c : commands) { 
 
     c.getStateList().sort(new Comparator<State>() { 
 
       @Override 
 
       public int compare(State o1, State o2) { 
 
        return o1.getStateDate().compareTo(o2.getStateDate()); 
 
       } 
 
     }); 
 

 
     c.getStateList().sort(Collections.reverseOrder()); 
 
    } 
 
request.setAttribute("commands", commands);

Но когда я показываю результаты, состояния не сортируются.

Я попытался отменить заказ, как вы можете видеть, но он не работает.

Как вы можете видеть, я заменил Collections.sort на ListIWantToSort.sort. Все еще не работает.

Любые идеи о том, почему это не работает или как я могу его починить?

EDIT: Вот геттер для списка и его создание экземпляра:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "ciiCommande") 
    private List<Etat> etatList; 

    @XmlTransient 
    public List<Etat> getEtatList() { 
     return etatList; 
    } 

    List<Commande> commandes = new ArrayList<Commande>(); 

И я получаю мои команды с помощью метода FindAll.

Чтобы отобразить их, я использую это:

<c:forEach items="${commandes}" var="cmd"> 
    <td>${cmd.etatList[0].codeStatut.libelleSituation}</td> 
</c:forEach> 
+0

Что возвращает 'c.getEtatList()'? –

+0

@ LutzHorn он возвращает список состояний, принятый заказом. – trichetriche

+0

Все ли в 'getEtatList()' реализует интерфейс 'Comparable'? – npinti

ответ

0

После нескольких дней борьбы мне удалось найти решение.

Список не сортируется после каждой попытки, которую я сделал. Я до сих пор не знаю, почему.

Но я нашел аннотацию @OrderBy, которая сортирует список так, как я хочу.

Благодарим вас за помощь, может быть, в один прекрасный день эта проблема будет разобрана (см. Каламбур? Я так смешной).

Приветствия

2

Try:

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()); 
        } 
       })); 
      } 

Поскольку метод сортировки вы используете добавлен интерфейс List в Java SE 8, я думаю, вы» re using Java SE 8. Затем вы можете переписать его следующим образом:

commandes.foreach(c -> 
    c.getEtatList().sort(Comparator.comparing(Etat::getDateEtat).reversed()); 
); 
+0

Извините, он не работает ни – trichetriche

+0

Что такое ошибка/вывод? – Puce

+0

Ошибка не возникает, все компилируется отлично. Но в моем приложении вместо показа «Delivered» (который должен быть последним состоянием), он показывает «Not Delivered» (который является предыдущим). FYI, я получаю первый результат списка, чтобы показать это состояние. – trichetriche

2

Вы сначала отсортировали список, используя свой собственный компаратор. Затем вы пересобираете его в соответствии с измененным порядком . заказ элементов - не пользовательский заказ, который вы уже применяли. Таким образом, первая сортировка не вступает в силу, поскольку список перенаправляется вторым типом. Обратите внимание, что Collections.reverseOrder() делает не обратный список - это обратная сторона натуральная заказ (поэтому элементы в getEtatList() уже должны быть Comparable).

Попробуйте потерять второго рода и делает:

c.getEtatList().sort(new Comparator<Etat>() { 
    @Override 
    public int compare(Etat o1, Etat o2) { 
     // Note o2/o1 reversed. 
     return o2.getDateEtat().compareTo(o1.getDateEtat()); 
    } 
}); 
+0

reverseOrder на самом деле другая попытка, я не использовал ее в первую очередь. Но, но спасибо за эту информацию, я запомню, что – trichetriche

+0

Я тоже пробовал, что все еще не работает. – trichetriche

+0

@ Kayaman Логически, это то же самое. – Paul

1

Это должно быть то, что вам нужно:

Comparator<Etat> comparator = new Comparator<Etat>() { 
     @Override 
     public int compare(Etat o1, Etat o2) { 
      return o1.getDateEtat().compareTo(o2.getDateEtat()); 
     } 
    }; 

    for (Commande c : commandes) { 
     Collections.sort(c.getEtatList(), comparator); 
     // or this one: Collections.sort(c.getEtatList(), Collections.reverseOrder(comparator)); 
    } 
+0

Не жаль, не работает. (Я также попытался с обратным порядком) – trichetriche

+0

Каков фактический тип 'getStateList()' в классе 'Command'? Предположим, что это «Список », или? – vikingsteve

+0

Да, это «Список ' (Состояние на французском языке): 'private List etatList;' – trichetriche

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)); 
+0

Можете ли вы попробовать создать новый класс под названием Command, имеющий список состояний как свойство? Затем вы создаете список команд и пытаетесь упорядочить каждый список состояний. – trichetriche

+0

@trichetriche. Это не изменит ситуацию, если один список можно отсортировать, можно также отсортировать несколько списков (если вы не перепутались в командном классе и делитесь списком или отправляете копию или ... - но я не могу догадаться, что вы сделали). Вы должны прочитать ссылку на MCVE, опубликованную мной в предыдущем комментарии, и следовать ее рекомендациям. – assylias

+0

мои классы остаются нетронутыми, так как я получил их как классы сущностей. И мой код очень длинный, поэтому я не могу сосредоточиться на создании хорошего примера. Может быть, если я создам хранилище git? – trichetriche

0

Я ценю ваш вопрос, как я только что испытал это. Я применил «Comparable» (как это было много раз) в моем классе JPA Entity. Когда вы делаете Collections.sort на myMainJPA_Object.getMyList(), переопределенный сопоставимый метод не запускается.

Моей задачей было создать новый 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 для аннотации, в моем случае, хотя мне нужно снова сортировать его по другому вызову метода, поэтому это решение работает для меня.

Смежные вопросы