0

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

在我的代码中,我有一个元素列表,我需要根据 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,我唯一需要的是剧集属性“id”(最低季和最低集数)。

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

我会很感激任何帮助。

4

2 回答 2

2

无法使用标准 Collections.sort() 机制对附加到 JDOM 元素的内容进行排序,因为该过程不遵守 XML 内容的一次仅附加一个位置的规则。

JDOM 在 Element 类中内置了 sort() 方法,允许您对智利元素或其他子内容进行排序:请参阅 The Element.sortChildren() Javadoc 了解 JDOM 的执行方式。

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

于 2013-09-04T20:08:25.113 回答
1

浏览列表并找到最小值有什么问题。它是 O(n),而排序是 O(n*log(n))。您可以使用通用的 min 函数,例如guava中的函数

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

如果您真的想对其进行排序,为什么不进行排序new ArrayList<Element>(episodes)(我同意 rolfl 的观点,即您不能将 Collections.sort 用于 JDOM 列表,并且错误来自您使用不可修改的列表)。

于 2013-09-04T20:06:32.213 回答