使用Java API对JDOM元素进行排序

时间:2013-09-04 19:17:51

标签: sorting element jdom

我需要你的帮助以解决以下问题:

在我的代码中我有一个元素列表,我需要根据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 Elements一起使用:

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,我唯一需要的是剧集属性“id”(最低季节和最低集数)。

你能推荐什么?我有另一个实现,我通过所有元素,但我不认为这是一个很好的解决方案......我也可以创建Java类Episode(id,episode,season),将List转换为List并对其进行排序,还可以不要认为这是个好主意。还有Element的sortContent方法,但我不确定如何实现它。

我会感激任何帮助。

2 个答案:

答案 0 :(得分:2)

附加到JDOM Elements的内容无法使用标准的Collections.sort()机制进行排序,因为该进程不支持XML内容中一次只附加一次的规则。

JDOM在Element类中内置了sort()方法,允许您对智能元素或其他子内容进行排序:请参阅Element.sortChildren() Javadoc以获取JDOM方法。

更新:另外,为了您的参考,您获得的错误是因为在某些时候您创建了一个不可修改的List版本....这不是从JDOM方法调用发生的事情。您得到的错误是因为您正在尝试修改有意设置为只读的List。

答案 1 :(得分: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列表,而且错误来自你使用不可修改的列表)。