如何对包含由“|〜”</string>分隔的多个字段的Lis​​t <string>进行排序

时间:2014-03-26 00:12:32

标签: java sorting comparator

我有List<String> theList 它具有以下类型的值

"2011-05-05|~JKED"
"2011-05-06|~ABC"
"2011-05-01|~XYZ"
"2011-05-01|~WWX"

你可以猜到有两个&#34;字段&#34;在theList

我想在第一个字段上排序theList然后在第二个字段上排序,例如我在排序操作后得到以下输出

"2011-05-01|~WWX"
"2011-05-01|~XYZ"
"2011-05-05|~JKED"
"2011-05-06|~ABC"

如果我将这两个字段放在单独的列表中并执行Collections.sort(field1List) Collections.sort(field2List),我会得到所需的输出。

但是,我想知道,如何使用Collections.sort(theList, new Comparator(){})能够对theList进行排序以获得所需的输出。如果无法通过Comparator()解决,请建议一些看似sortMultiFieldList(List<String> theList)的方法

为什么我必须在一个列表中包含两个或更多字段,这是一个很长的故事。

如果您需要更多说明,请与我们联系。

1 个答案:

答案 0 :(得分:3)

这非常简单。您将要为此编写自定义Comparator,并强制执行其比较逻辑,以便按照您希望的方式处理两个单独的&#34;字段&#34;。

这里的动机是这些字段按字典顺序比较日期部分以及字母字符串部分。如果你发现日期比较并没有给你准确的结果(并且可能没有;我不确定任何情况下它不会起作用),然后将其转换为Date并将其与内嵌进行比较。

Collections.sort(entries, new Comparator<String>() {
    @Override
    public int compare(String left, String right) {
        String[] leftFragments = left.split("[|]");
        String[] rightFragments = right.split("[|]");
        if(leftFragments[0].compareTo(rightFragments[0]) == 0) {
            return leftFragments[1].compareTo(rightFragments[1]);
        } else {
            return leftFragments[0].compareTo(rightFragments[0]);
        }
    }
});