Java是否具有按字典顺序排列列表(而不是列表元素)的功能?

Java是否具有按字典顺序排列列表(而不是列表元素)的功能?,java,sorting,haskell,Java,Sorting,Haskell,在Haskell中,Ord a=>[a]类型的列表具有字典顺序。比如说, > compare [1, 2, 3] [2, 3, 4] LT > compare [1] [1, 2] LT "abc".compareTo("bcd") // -1 "a".compareTo("ab") // -1 这是大多数语言对字符串的词典排序的直接概括。例如,在Java中 > compare [1, 2, 3] [2, 3, 4] LT > compare [1] [1,

在Haskell中,
Ord a=>[a]
类型的列表具有字典顺序。比如说,

> compare [1, 2, 3] [2, 3, 4]
LT
> compare [1] [1, 2]
LT
"abc".compareTo("bcd")  // -1
"a".compareTo("ab")     // -1
这是大多数语言对字符串的词典排序的直接概括。例如,在Java中

> compare [1, 2, 3] [2, 3, 4]
LT
> compare [1] [1, 2]
LT
"abc".compareTo("bcd")  // -1
"a".compareTo("ab")     // -1
在标准库或其他库中是否有Java函数实现Haskell所拥有的列表的字典顺序?我希望它有一个沿着

<T extends Comparable<T>> int compare(List<T>, List<T>)
int比较(列表,列表)

自己实现它并不困难,但我宁愿不重新发明轮子。

我所知道的没有这种方法<代码>列表(及其具体实现,如
ArrayList
)不扩展/实现
comable
接口,这意味着它们自己不实现排序

我认为这是一个正确的语言决定,因为在我看来,列表确实没有规范的顺序

您可以实现自己的比较列表的comparator,并将其传递给需要比较列表的对象(例如
Collections.sort(list,comparator)
)。例如:

class LexicographicalListComparator<T extends Comparable<T>> implements Comparator<List<T>> {
    @Override
    public int compare(List<T> o1, List<T> o2) {
        Iterator<T> i1 = o1.iterator();
        Iterator<T> i2 = o2.iterator();
        int result;

        do {
            if (!i1.hasNext()) {
                if (!i2.hasNext()) return 0; else return -1;
            }
            if (!i2.hasNext()) {
                return 1;
            }

            result = i1.next().compareTo(i2.next());
        } while (result == 0);

        return result;
    }
}
类词典编纂器实现比较器{
@凌驾
公共整数比较(列表o1,列表o2){
迭代器i1=o1.Iterator();
迭代器i2=o2.Iterator();
int结果;
做{
如果(!i1.hasNext()){
if(!i2.hasNext())返回0;否则返回-1;
}
如果(!i2.hasNext()){
返回1;
}
结果=i1.next().compareTo(i2.next());
}而(结果=0);
返回结果;
}
}

如果第三方库是公平的游戏,那么这只是
排序.natural().lexicographic()
。不过,基本Java中没有任何内置的功能。

正如Hoopje所说,
List
没有实现
可比的
接口。如果您想实现自己的比较器来按字典顺序比较字符串(然后您可以对字符串列表进行排序),Java拥有以下类:

Collator类执行区分区域设置的字符串比较

如果这还不够,您可以使用它,它可以作为
Collator
,但您可以对其进行更多的个性化设置

它们都实现了
Comparable
接口,因此可以使用
compare

import java.text.Collator;
...
Collator c = Collator.getInstance();
c.compare(s1, s2);
如果希望它遵循某些区域设置敏感规则,则必须执行以下操作:

import java.util.Locale;
...
Collator c = Collator.getInstance(new Locale("es", "MX"));
c.compare(s1, s2);

以下是有关的详细信息。

您是在寻找一个保持其元素的字典顺序的列表实现,还是想要一个按字典顺序比较两个列表的函数?@Mick助记符一个按字典顺序比较两个列表的函数。字典顺序字符串与按字典顺序比较列表无关。