2017-09-07 48 views
5

Próba posortowania (rosnąco) listy ciągów w kolejności czytelnej dla człowieka/człowieka. Coś jak poniżej.Sortowanie listy w porządku naturalnym w Groovy

def list = ['f3', 'f10', 'f1', 'f12', 'f2', 'f34', 'f22','f20','f50', 'f5'] 
list.sort() 

Mogłem znaleźć przykładowy kod Javy w GitHub. Ale szuka groovy sposób. Każda pomoc jest doceniana.

Pożądany wyjściowa:

f1, f2, f3, f5, f10, f12, f20, f22, f34, f50 
+0

co powinno być w związku? – daggett

+0

@daggett, Po prostu porządek naturalny (rosnąco), nie ma żadnych mylących danych w powyższym tekście. Zaktualizowane pytanie. – Rao

Odpowiedz

1
def list = ['f3', 'f10', 'f1', 'f12', 'f2', 'f34', 'f22','f20','f50', 'f5'] 
list.collect{ (it=~/\d+|\D+/).findAll() }.sort().collect{ it.join() } 

Wynik:

[f1, f2, f3, f5, f10, f12, f20, f22, f34, f50] 
+0

Dzięki za szybką odpowiedź docenioną. – Rao

+0

To nie jest pytanie. Powyższe może nie działać, jeśli poprzednia liczba jest zerem. – Rao

+0

w prawo. Zrobiłem ten kod do sortowania numerów wersji. – daggett

3
def list = ['f3', 'f10', 'f1', 'f12', 'f2', 'f34', 'f22','f20','f50', 'f5', 'f9'] 
list.sort { it[1..-1] as int }​ 

Wyniki:

[f1, f2, f3, f5, f9, f10, f12, f20, f22, f34, f50] 
+0

dmahapatro, czy odnosi się do problemu wspomnianego w powyższej odpowiedzi? – Rao

+0

Powinno. Możesz łatwo przetestować to w doskonałej konsoli. :) https://groovyconsole.appspot.com/script/5171137738702848 – dmahapatro

+1

Dzięki, właśnie wypróbowałem to: ['g12', 'g01', 'g11', 'f3', 'f010', 'f01', 'f12 ',' f2 ',' f34 ',' f22 ',' f20 ',' f50 ',' f5 ',' f9 '] 'i wydają się nie działać, jeśli istnieją różne prefiksy. Jeśli ten sam prefiks, to twój działa. – Rao

1

Można również użyć następujących komparatora:

list.sort { a,b -> a[0] <=> b[0] == 0 ? 
     (a[1..-1] as int) <=> (b[1..-1] as int) : 
     a[0] <=> b[0] 
} 

Porównuje literały w pierwszej kolejności, a gdy są one równe porównuje część numeryczną. Stosując tę ​​metodę z listy jak:

['f3', 'f10', 'f1', 'f12', 'f2', 'f34', 'f22','f20','f50', 'f5', 'g1', 'g11', 'z0', 'a00', 'a01'] 

generuje następujący wynik:

[a00, a01, f1, f2, f3, f5, f10, f12, f20, f22, f34, f50, g1, g11, z0] 
+0

Dziękuję. Sprawdzę i zaktualizuję. – Rao