正如问题所述,我遇到了这个问题。我知道它为什么会在开头,因为它是1和0,所以即使排序后,它也在9之前。但是,使用列表的sort()
方法可以将其按正确的顺序排列吗?
正如问题所述,我遇到了这个问题。我知道它为什么会在开头,因为它是1和0,所以即使排序后,它也在9之前。但是,使用列表的sort()
方法可以将其按正确的顺序排列吗?
您需要将列表更改为包含数字(例如,整数
或双精度
),而不是字符串。
如果由于某些原因需要列表是String
类型的(我认为这很不可能),一种选项(使用Guava)是:
List<String> numbers = ...;
Collections.sort(numbers, Ordering.natural().onResultOf(
new Function<String, Integer>() {
public Integer apply(String from) {
return Integer.valueOf(from);
}
}));
这个函数将基于每个字符串所代表的整数值对字符串列表进行排序。如果不是每个字符串都可以被解析为一个整数,就会抛出异常。
另一个建议:
如果您需要坚持使用字符串并且不想使用数字或等效类,则可以实现Comparator<String>
来支持排序算法。这样,您就可以按需要对元素进行排序。
如果你在进行字符串排序而不是数字排序,这段代码可能会帮助你理解它们之间的区别:
ArrayList stringList = new ArrayList();
stringList.add("9");
stringList.add("10");
Collections.sort(stringList);
Assert.assertEquals("10", stringList.get(0));
ArrayList integerList = new ArrayList();
integerList.add(9);
integerList.add(10);
Collections.sort(integerList);
Assert.assertEquals(9, integerList.get(0));
使用JUnit断言进行断言。
正如其他人所说,如果您打算对实际数字进行排序,请不要将它们存储为字符串。如果您真的想自然地对包含数字的字符串进行排序,我更喜欢使用Apache Commons Collection Utils ComparatorUtils.NATURAL_COMPARATOR,尽管还有其他选项具有不同的可配置性和功能。
Java不支持自然排序String
对象,这可能是您需要的方式。请参阅Java Trail。主要原因是由于许多不同的语言等原因,这样做会太复杂。因此,关于将您的List<String>
更改为List<Integer>
或List<Double>
的先前答案可能是一个更好的想法。
但是,Stackoverflow上的this question可能对您有所帮助。
我无法理解它,因为我正在创建整数而不是字符串,但它没有起作用。
但是后来我在代码中发现了一个小错误,我忘记了注释掉的Integer.parseint(String)
。
答案的人们尽管给了很多其他方法来处理这个问题,还是非常有帮助的。
序列的字典顺序。