2013-09-04 3 views
0

мне нужна ваша помощь в следующем вопросе:Сортировка JDOM элементов с использованием Java API

В моем коде у меня есть список элементов, мне нужно отсортировать этот список по 2 признакам: сезон и номер.

Список примеров:

<episode_list> 
<episode id="280" number="13" season="1"> 
<title><![CDATA[Bowl Game]]></title> 
</episode> 
<episode id="314" number="12" season="1"> 
<title><![CDATA[Piss Test]]></title> 
</episode> 
<episode id="730" number="11" season="1"> 

Я использую Collections.sort(), но получаю исключение. Как я понимаю, что я не могу использовать его с JDOM элементов:

List<Element> episodes; 

Collections.sort(episodes, new Comparator<Element>() { 

      @Override 
      public int compare(Element elem1, Element elem2) { 
       Integer seasonNumber1 = Integer.valueOf(myService.valueOfAttribute("season", elem1)); 
       Integer seasonNumber2 = Integer.valueOf(myService.valueOfAttribute("season", elem2)); 
       int seasonComp = seasonNumber1.compareTo(seasonNumber2); 
       if (seasonComp != 0) { 
        return seasonComp; 
       } else { 
        Integer episodeNumber1 = Integer.valueOf(myService.valueOfAttribute("number", elem1)); 
        Integer episodeNumber2 = Integer.valueOf(myService.valueOfAttribute("number", elem2)); 
        return episodeNumber1.compareTo(episodeNumber2); 
       }     
      }  
     }); 


Exception: java.util.Collections$UnmodifiableList$1.set(Unknown Source) 
      java.util.Collections.sort(Unknown Source) 

На самом деле мне не нужен отсортированный XML, единственное, что мне нужно, это атрибут эпизод «идентификатор» (для самого низкого сезона и самый низкий эпизод номер).

Что вы можете порекомендовать? У меня есть другая реализация, в которой я просматриваю все элементы, но я не думаю, что это хорошее решение ... Я также могу создать Java-класс Episode (id, episode, season), преобразовать список в список и отсортировать его, но также не думайте, что это хорошая идея. Существует также метод sortContent для Element, но я не уверен, как его реализовать.

Буду признателен за любую помощь.

ответ

1

Что случилось с просмотром списка и поиском минимума. Это O (n), а сортировка - O (n * log (n)). Вы можете использовать общую мин функцию, например, один в guava

Element firstEpisode = Ordering.from(your-comparator).min(episodes.iterator()); 

Если вы действительно хотите разобраться, то почему бы вам не сортировать new ArrayList<Element>(episodes) (я согласен с rolfl, что вы не можете использовать Collections.sort для JDOM списки и что ошибка исходит из вашего использования немодифицируемого списка).

1

Содержимое, прикрепленное к элементам JDOM, не может быть отсортировано с использованием стандартного механизма Collections.sort(), потому что этот процесс не соблюдает правило только для присоединенного к одному месту для содержимого XML.

JDOM имеет методы sort(), встроенные в класс Element, который позволяет вам сортировать элементы chile или другое дочернее содержимое. См. Раздел Element.sortChildren() Javadoc для способа JDOM.

Обновление: Кроме того, для вашей справки ошибка, которую вы получаете, заключается в том, что в какой-то момент вы создали немодифицируемую версию List ... это не то, что происходит от вызовов метода JDOM. Ошибка, которую вы получаете, заключается в том, что вы пытаетесь изменить список, который был намеренно создан только для чтения.

+0

Спасибо! Я просто решил пройти через все элементы, так как мне не нужен весь xml, отсортированный. – user2101310

+0

Для людей, которые застряли в JDOM 1, самым простым способом является получение списка с помощью element.removeContent(), затем сортировка, а затем использование setContent() или addContent() для его возврата. – Trejkaz

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