在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>)
自己实施并不困难,但我宁愿不重新发明轮子。
答案 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类:
Collator类执行区分区域敏感的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的更多信息。