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

时间:2015-08-02 06:16:24

标签: java sorting haskell

在Haskell中,类型Ord a => [a]的列表具有词典排序。例如,

> compare [1, 2, 3] [2, 3, 4]
LT
> compare [1] [1, 2]
LT

这是大多数语言对字符串的词典排序的直接概括。例如,在Java中,

"abc".compareTo("bcd")  // -1
"a".compareTo("ab")     // -1

标准库或其他库中是否有任何Java函数实现Haskell所具有的列表的字典排序?我希望它有一个类型签名

<T extends Comparable<T>> int compare(List<T>, List<T>)

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

3 个答案:

答案 0 :(得分:6)

如果第三方图书馆是公平游戏,那么在Guava这只是Ordering.natural().lexicographical()。但是,基本Java中没有任何内容。

答案 1 :(得分:3)

我知道没有这样的方法。 List(及其具体实现,例如ArrayList)不会扩展/实现Comarable接口,这意味着它们自己不实现排序。

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

您可以实现自己的比较器来比较列表,并将其传递给需要比较列表的对象(例如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;
    }
}

答案 2 :(得分:-1)

正如Hoopje所说,List没有实现Comparable接口。如果你想实现自己的比较器来按字典顺序比较字符串(之后你可以命令字符串列表),Java有Collator类:

  

Collat​​or类执行区分区域敏感的String比较。

如果这还不够,您可以使用RuleBasedCollator,它可以作为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);

以下是Locale的更多信息。