Chciałbym posortować tablicę łańcuchów (w javascript) tak, że grupy cyfr w łańcuchach są porównywane jako liczby całkowite, a nie łańcuchy. Nie martwię się liczbami sygnowanymi lub zmiennoprzecinkowymi.jak sortować ciągi znaków w javascript numerycznie
na przykład, wynik powinien być ["a1b3","a9b2","a10b2","a10b11"]
nie ["a1b3","a10b11","a10b2","a9b2"]
Najłatwiej to zrobić wydaje się być podział każdy ciąg na granicach wokół grup cyfr. Czy istnieje wzór, który mogę przekazać do String.split, aby podzielić granice postaci bez usuwania żadnych znaków?
"abc11def22ghi".split(/?/) = ["abc","11","def","22","ghi"];
Czy jest jakiś inny sposób porównywania ciągów znaków, które nie wiążą się dzieląc je, być może przez dopełnienie wszystkich grup cyfr z wiodącymi zerami tak są one tej samej długości?
"aa1bb" => "aa00000001bb", "aa10bb" => "aa00000010bb"
Pracuję z dowolnych ciągów, a nie ciągi, które mają specyficzny układ grup cyfr.
Edit:
Lubię /(\d+)/
jeden wyłożenia z Gaby podzielić tablicę. Jak to jest zgodne z poprzednimi wersjami?
Rozwiązania, które analizują łańcuchy w sposób, który można wykorzystać do odbudowania oryginałów, są znacznie wydajniejsze niż ta funkcja porównywania. Żadna z odpowiedzi nie obsługuje niektórych ciągów zaczynających się cyframi, a innych nie, ale byłoby to łatwe do naprawienia i nie było jednoznaczne w pierwotnym pytaniu.
["a100","a20","a3","a3b","a3b100","a3b20","a3b3","!!","~~","9","10","9.5"].sort(function (inA , inB) {
var result = 0;
var a , b , pattern = /(\d+)/;
var as = inA.split(pattern);
var bs = inB.split(pattern);
var index , count = as.length;
if (('' === as[0]) === ('' === bs[0])) {
if (count > bs.length) count = bs.length;
for (index = 0 ; index < count && 0 === result ; ++index) {
a = as[index]; b = bs[index];
if (index & 1) {
result = a - b;
} else {
result = !(a < b) ? (a > b) ? 1 : 0 : -1;
}
}
if (0 === result) result = as.length - bs.length;
} else {
result = !(inA < inB) ? (inA > inB) ? 1 : 0 : -1;
}
return result;
}).toString();
wynik: "!!,9,9.5,10,a3,a3b,a3b3,a3b20,a3b100,a20,a100,~~"
Czy części nienumeryczne są zawsze takie same? Jeśli nie, to czy algorytm sortowania powinien je sortować w kolejności ASCII? –
W twoim przykładzie wyodrębniasz 13, 92, 102, 1011? Czy może bardziej przypomina 1.3, 9.2, 10.2, 10.11? Chodzi mi o to, czy pierwszy numer jest bardziej znaczący, czy litery są po prostu ignorowane? –
... o, nadal chcesz sortować na niecałkowatych też, teraz to rozumiem ... –