【问题标题】:How Arrays.sort() works on numeric Strings [duplicate]Arrays.sort() 如何处理数字字符串 [重复]
【发布时间】:2022-01-25 18:12:26
【问题描述】:

向社区致敬!

我在互联网上浏览了很多,但在我的案例中找不到答案。我的问题是,当我们向 Arrays.sort() 提供一个数字字符串数组时,它如何对它们进行排序。就像我有一个包含数字的字符串数组

String[] numerics= {"1","2","3","12","-7"}

当我申请时

  Arrays.sort(numerics)

输出为

排序前

[1, 2, 3, 12, -7]

应用 Arrays.sort() 之后

[-7, 1, 12, 2, 3]

我想知道 Arrays.sort() 是如何对这个字符串数组进行排序的。?

【问题讨论】:

  • "我想知道 Arrays.sort() 如何对这个字符串数组进行排序。?" - 按字典顺序。见the documentation of String::compareTo
  • 您知道您可以看到该方法的代码并通过它进行调试吗?
  • 感谢您指出。我对字典顺序进行了一些研究,但无法将其与我的案例(我的字符串)联系起来,或者无法弄清楚它在这种情况下是如何工作的。
  • takendarkk 我知道。在我的情况下 Arrays.sort(Object[] os) 被称为
  • 这个最近在另一个问题here

标签: java arrays string


【解决方案1】:

用字符串表示的数字排序不起作用,正如您已经发现的那样。

如果您查看 ASCII 表,您会发现连字符位于表中所有数字之前。

https://www.asciitable.com/

这就是为什么你的负数(实际上是连字符)排在第一位的原因。

至于排序的工作原理,这将是逐个字符的比较。 换句话说,排序会比较每个字符串的第一个字符,然后是每个字符串的第二个字符,依此类推...

如果您必须将字符串作为数字进行比较,您可以将每个字符串转换为数字,对该数组进行排序,然后将它们转换回字符串。

如果您真的在处理数字,最好将它们作为数字(整数或小数)存储和使用。

【讨论】:

  • 重点不是通过 sort() 方法对数字进行排序,而只是询问如果我们提供这样的字符串,系统是如何工作的。但是你的 ASCII 点在一定程度上解决了这个问题。我还想他们可能会通过他们的 asci 代码进行比较。如果一个更好的答案来自前辈,那将是可观的。否则我会接受你的回答。谢谢大佬
【解决方案2】:

@Lee Boozer 的回答是正确的。字符串逐个字符进行比较,直到找到第一个差异。找到的第一个不同字符将作为 ASCII 进行比较,结果是字符串比较的结果。所以显然这个“3”将大于“27”。因此,您可以将字符串转换为整数(或长整数)并比较它们,或者您可以使用一个名为 MgntUtils 的开源库,它有一个 VersionComparator 类,该类接受诸如“3.5.2”和“15.7”之类的字符串并比较它们通过逐个比较由“。”分隔的数字。所以像“5”或“27”这样的任何数字字符串也将是一个有效的版本,因此可以通过VersionComparator相互比较。一个缺点是它不适用于负数,而且它是设计使然。这里是Javadoc。该库可以在 Maven 中心 here 和 Github 上找到,包括 Javadoc 和源代码 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多