Вопрос не указывает, как лечить отрицательные числа в лексикографическом порядке сортировки. Методы на основе строки, представленные ранее, как правило, будут сортировать отрицательные значения к фронту; например, {-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
после сортировки с помощью Arrays.sort(dar);
.
В разделе «сар закон» показывает массив sar
после сортировки с Arrays.sort(sar,lexCompare);
, где lexCompare
похож на Comparator
показанный в ответ Джейсон Коэна.
Раздел «лар с журнала» показывает массив lars
после сортировки с помощью Arrays.sort(lars,slogCompare);
, иллюстрирующая способ логарифм основе , что дает тот же порядок , как это делают lexCompare
и другие методы на основе строки.
Раздел «LAR журнала» показывает массив 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");
}
}