这个问题没有说明如何处理字典排序中的负整数。之前介绍的基于字符串的方法通常会将负值排在前面;例如,{-123,-345,0,234,78}将保持这个顺序。但是,如果减号应该被忽略,则输出顺序应为{0,-123,234,-345,78}。可以通过一些繁琐的额外测试来调整基于字符串的方法以产生该顺序。
在理论和代码上,使用比较两个整数的公共对数的小数部分的比较器可能更简单。也就是说,它将比较两个数字的以10为底的对数的尾数。基于对数的比较器将根据CPU的浮点性能规格和实现质量而运行得更快或更慢。
本答案末尾显示的Java代码包括两个基于对数的比较器:
alogCompare
和
slogCompare
。前者忽略符号,因此将从{ -123,-345,0,234,78 }产生{ 0,-123,234,-345,78 }。
接下来显示的数字组是Java程序生成的输出。
“dar rand” 部分显示了随机数据数组
dar
的生成情况。它从左到右读取,每行 5 个元素。请注意,数组
sar
、
lara
和
lars
最初是未排序的
dar
的副本。
“dar sort” 部分是通过
Arrays.sort(dar);
排序后的
dar
。
“sar lex” 部分显示了使用
Arrays.sort(sar,lexCompare);
进行排序后的数组
sar
,其中
lexCompare
类似于 Jason Cohen 的答案中所示的
Comparator
。
“lar s log” 部分显示了使用
Arrays.sort(lars,slogCompare);
进行排序后的数组
lars
,演示了一种基于对数的方法,该方法与
lexCompare
和其他基于字符串的方法给出相同的顺序。
“lar a log” 部分显示了使用
Arrays.sort(lara,alogCompare);
进行排序后的数组
lara
,演示了一种基于对数的方法,该方法忽略负号。
dar rand -335768 115776 -9576 185484 81528
dar rand 79300 0 3128 4095 -69377
dar rand -67584 9900 -50568 -162792 70992
dar sort -335768 -162792 -69377 -67584 -50568
dar sort -9576 0 3128 4095 9900
dar sort 70992 79300 81528 115776 185484
sar lex -162792 -335768 -50568 -67584 -69377
sar lex -9576 0 115776 185484 3128
sar lex 4095 70992 79300 81528 9900
lar s log -162792 -335768 -50568 -67584 -69377
lar s log -9576 0 115776 185484 3128
lar s log 4095 70992 79300 81528 9900
lar a log 0 115776 -162792 185484 3128
lar a log -335768 4095 -50568 -67584 -69377
lar a log 70992 79300 81528 -9576 9900
下面展示了Java代码。
import java.util.Random;
import java.util.Comparator;
import java.lang.Math;
import java.util.Arrays;
public class lex882954 {
public static Comparator<Integer> lexCompare = new Comparator<Integer>(){
public int compare( Integer x, Integer y ) {
return x.toString().compareTo( y.toString() );
}
};
public static Comparator<Integer> alogCompare = new Comparator<Integer>(){
public int compare( Integer x, Integer y ) {
Double xl = (x==0)? 0 : Math.log10(Math.abs(x));
Double yl = (y==0)? 0 : Math.log10(Math.abs(y));
Double xf=xl-xl.intValue();
return xf.compareTo(yl-yl.intValue());
}
};
public static Comparator<Integer> slogCompare = new Comparator<Integer>(){
public int compare( Integer x, Integer y ) {
Double xl = (x==0)? 0 : Math.log10(Math.abs(x));
Double yl = (y==0)? 0 : Math.log10(Math.abs(y));
Double xf=xl-xl.intValue()+Integer.signum(x);
return xf.compareTo(yl-yl.intValue()+Integer.signum(y));
}
};
public static void printArr(Integer[] ar, int asize, String aname) {
int j;
for(j=0; j < asize; ++j) {
if (j%5==0)
System.out.printf("%n%8s ", aname);
System.out.printf(" %9d", ar[j]);
}
System.out.println();
}
public static void main(String[] args) {
int j, dasize=15, hir=99;
Random rnd = new Random(12345);
Integer[] dar = new Integer[dasize];
Integer[] sar = new Integer[dasize];
Integer[] lara = new Integer[dasize];
Integer[] lars = new Integer[dasize];
for(j=0; j < dasize; ++j) {
lara[j] = lars[j] = sar[j] = dar[j] = rnd.nextInt(hir) *
rnd.nextInt(hir) * (rnd.nextInt(hir)-44);
}
printArr(dar, dasize, "dar rand");
Arrays.sort(dar);
printArr(dar, dasize, "dar sort");
Arrays.sort(sar, lexCompare);
printArr(sar, dasize, "sar lex");
Arrays.sort(lars, slogCompare);
printArr(lars, dasize, "lar s log");
Arrays.sort(lara, alogCompare);
printArr(lara, dasize, "lar a log");
}
}