2016-11-27 105 views
-2

我有一个包含以下值的List<String>如何自定义Collections.sort()以字符串的数字前缀进行排序

[1H,0H,2H,10H,4H,9H,3H,7H ,8H,6H,5H]

当我使用Collections.sort()排序它,顺序变为:

[OH,10H,1H,2H,3H,4H,5H,6H,7H,8H ,9h]

相反,它应该是:

[OH,1H,2H,3H,4H,5H,6H,7H,8H,9H,10H]

我怎样才能做到这一点?

+0

你可以添加你的代码吗? – developer

+0

'Collections.sort()'给出[01h,02h,10h]如果元素是字符串 –

+0

您是否尝试对'List '进行排序?如果是的话,那么这里有什么不对,因为它**从不**会像你说的那样下令。如果不是,那么请告诉我们你正在尝试分类的班级是什么。 – MiguelKVidal

回答

1

你在问题中引用的输出是正常的。如果您查看Collection.sort的API说明,您会看到:

根据元素的自然排序将指定列表按升序排序。列表中的所有元素都必须实现Comparable接口。此外,列表中的所有元素必须相互可比(即,e1.compareTo(e2)不得为列表中的任何元素e1和e2抛出ClassCastException)。

通过他们的意思可以通过compareTo -method指定的顺序自然顺序(接口Comparable只有该方法compareTo),它告诉阉羊的this -object是大于(返回严格的正整数),或相等(返回0),少于(返回严格的负整数)比作为参数在顺序中传递的对象。要知道对象a应该在对象b之前获得,它只会调用a.compareTo(b)

  • 如果它的结果​​是严格正(> 0)的sort方法b后排序数组中设置a
  • 如果结果是严格否定的(< 0)sort方法将设置a之前b排序的数组中。
  • 如果它的结果​​为0,sort方法不会改变它们的顺序。

我要提到the API of the compareTo method in the String class,它的细节串有如何有序,什么方法返回解释。
它所做的只是在每个字符串上迭代每个字符的字符,并在相同位置比较字符,直到找到差异。如果在该差异处,this字符串的字符具有更高的Unicode value,它将返回严格的正整数(this纵宽更大),否则它将返回严格的负整数(this-字符串比参数低) 。如果没有发现差异,它将返回0(this -string和参数具有相同的“顺序值”)。
现在你的情况(以及许多第一次定购字符串的人)的问题是整数无法用该Unicode排序进行排序,因为每个字符都是字符。如果必须对String s1 = "19"String s2 = "1119"进行排序,则会调用s1.compareTo(s2)。第一个区别在于第二个字符s1具有9s2在该位置具有1。由于1在Unicode-表之前1具有值十六进制值31和9具有十六进制值39),s1.compareTo(s2)将返回一个严格的正整数(请参阅API的链接以查看哪个值)。因此它将在排序阵列中的s1之前放s2,即使1119 > 19

所以,现在你知道它为什么排序这样,让我们​​看看有什么解决方法:

  1. Map您的数组元素使用Integer.parseInt方法,梳理这些十进制值的开始部分的十进制值并将结果排序的数组映射回原始元素。我不会推荐这个解决方案,因为额外的集合和由于映射而产生的额外代码。
  2. 创建您自己的Comparator-object,在那里指定您希望如何排序字符串(例如,使用Integer.parseInt方法),并将其作为参数传递给Collections.sort方法。通过将它作为参数传递,您可以告诉排序方法使用Comparator对象而不是传统的compareTo方法。 This link显示了如何使用Comparator对数组进行排序。这与使用它来排列数组列表的方式非常相似。

希望它有帮助!

祝你好运

相关问题