为什么在使用Sort()方法后,ArrayList的开头会出现数字10?

3

正如问题所述,我遇到了这个问题。我知道它为什么会在开头,因为它是1和0,所以即使排序后,它也在9之前。但是,使用列表的sort()方法可以将其按正确的顺序排列吗?


5
你的问题并不是很清晰,也许你可以添加一些代码吗?我有一种预感你正在对字符串进行排序。 - Noel M
5
您需要进行“自然排序”。以下是一个包含答案的先前问题:https://dev59.com/snM_5IYBdhLWcg3wt1g0 - Mark Ransom
3
也许你正在对字符串进行排序,而不是数字? - Kevin
8个回答

12

您需要将列表更改为包含数字(例如,整数双精度),而不是字符串。


4
也许他需要使用字符串。如果是这样,他应该使用自然排序。 - Alexandre Pepin

3

如果由于某些原因需要列表是String类型的(我认为这很不可能),一种选项(使用Guava)是:

List<String> numbers = ...;
Collections.sort(numbers, Ordering.natural().onResultOf(
    new Function<String, Integer>() {
      public Integer apply(String from) {
        return Integer.valueOf(from);
      }
    }));

这个函数将基于每个字符串所代表的整数值对字符串列表进行排序。如果不是每个字符串都可以被解析为一个整数,就会抛出异常。


1

另一个建议:

如果您需要坚持使用字符串并且不想使用数字或等效类,则可以实现Comparator<String>来支持排序算法。这样,您就可以按需要对元素进行排序。


0

如果你在进行字符串排序而不是数字排序,这段代码可能会帮助你理解它们之间的区别:

    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断言进行断言。


0

正如其他人所说,如果您打算对实际数字进行排序,请不要将它们存储为字符串。如果您真的想自然地对包含数字的字符串进行排序,我更喜欢使用Apache Commons Collection Utils ComparatorUtils.NATURAL_COMPARATOR,尽管还有其他选项具有不同的可配置性和功能。


0

Java不支持自然排序String对象,这可能是您需要的方式。请参阅Java Trail。主要原因是由于许多不同的语言等原因,这样做会太复杂。因此,关于将您的List<String>更改为List<Integer>List<Double>的先前答案可能是一个更好的想法。

但是,Stackoverflow上的this question可能对您有所帮助。


0

我无法理解它,因为我正在创建整数而不是字符串,但它没有起作用。

但是后来我在代码中发现了一个小错误,我忘记了注释掉的Integer.parseint(String)

答案的人们尽管给了很多其他方法来处理这个问题,还是非常有帮助的。


Kasper,你应该编辑你的问题并提及这一点,或者将其作为问题的评论添加进去。因为这并不是一个真正的答案。 - ColinD

0

序列的字典顺序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接