Вопрос не указывает, как обращаться с отрицательными целыми числами в лексикографическом порядке сортировки. Представленные ранее строковые методы обычно сортируют отрицательные значения во фронт; например, {-123, -345, 0, 234, 78} будут оставлены в этом порядке. Но если знаки минуса должны были игнорироваться, порядок вывода должен быть {0, -123, 234, -345, 78}. Можно было бы применить метод на основе строк для получения этого порядка с помощью несколько громоздких дополнительных тестов.
В теории и в коде может быть проще использовать компаратор, который сравнивает дробные части общих логарифмов двух целых чисел. То есть он будет сравнивать мантиссы из 10 основных логарифмов двух чисел. Компаратор на основе логарифма будет работать быстрее или медленнее, чем компаратор на основе строк, в зависимости от характеристик производительности процессора с плавающей запятой и качества реализаций.
Java-код, показанный в конце этого ответа, включает два логарифмических компаратора: alogCompare
и slogCompare
. Первый игнорирует знаки, поэтому выдает {0, -123, 234, -345, 78} из {-123, -345, 0, 234, 78}.
Числовые группы, показанные ниже, являются выводом, произведенным программой java.
В разделе «dar rand» показан массив случайных данных dar
в том виде, как он сгенерирован. Он читает поперек, а затем вниз, 5 элементов в строке. Обратите внимание, что массивы sar
, lara
и lars
изначально являются несортированными копиями dar
.
Секция «dar sort» - это dar
после сортировки по Arrays.sort(dar);
.
В разделе «sar lex» показан массив sar
после сортировки с Arrays.sort(sar,lexCompare);
, где lexCompare
аналогично Comparator
, показанному в ответе Джейсона Коэна.
Раздел «lar s log» показывает массив lars
после сортировки по Arrays.sort(lars,slogCompare);
, иллюстрируя метод, основанный на логарифме, который дает тот же порядок, что и do lexCompare
, и другие методы, основанные на строках.
Раздел «lar a log» показывает массив lara
после сортировки по Arrays.sort(lara,alogCompare);
, иллюстрируя метод, основанный на логарифме, который игнорирует знаки минус.
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-код показан ниже.
// Code for "How can I sort numbers lexicographically?" - jw - 2 Jul 2014
import java.util.Random;
import java.util.Comparator;
import java.lang.Math;
import java.util.Arrays;
public class lex882954 {
// Comparator from Jason Cohen's answer
public static Comparator<Integer> lexCompare = new Comparator<Integer>(){
public int compare( Integer x, Integer y ) {
return x.toString().compareTo( y.toString() );
}
};
// Comparator that uses "abs." logarithms of numbers instead of strings
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());
}
};
// Comparator that uses "signed" logarithms of numbers instead of strings
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));
}
};
// Print array before or after sorting
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();
}
// Main Program -- to test comparators
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");
}
}