Sortare obiecte String

Încerc doar să văd dacă există o modalitate ușoară de a sorta o listă de obiecte String. Problema cu care mă confrunt acum este că metoda Collections.sort (...) nu funcționează pentru mine.

Aceasta este lista mea originală, care pentru scopurile mele este sortată:

    List values = new ArrayList();


    values.add("section_1");
    values.add("section_2");
    values.add("section_3");
    values.add("section_4");
    values.add("section_5");
    values.add("section_6");
    values.add("section_7");
    values.add("section_8");
    values.add("section_9");
    values.add("section_10");
    values.add("section_11");
    values.add("section_12");
    values.add("section_13");

Și după ce a făcut Collections.sort (values), comanda este acum spartă:

section_1
section_10
section_11 
section_12
section_13
section_2
section_3
section_4
section_5
section_6
section_7
section_8
section_9

Este acest comportament din cauza ordonării lexicografice folosită în Collections.sort (...)? Există o modalitate mai ușoară de a face acest tip de lucru așa cum vreau eu?

Mulțumesc anticipat.

0
adăugat autor Shaggy Frog, sursa

3 răspunsuri

Este acest comportament din cauza ordonării lexicografice folosită în Collections.sort (...)?

Absolut. Ați sortat șirurile în funcție de ordinea naturală.

Există o modalitate mai ușoară de a face acest tip de lucru așa cum vreau?

Create a class implementing Comparator which expresses the comparison you want to use, and pass that as a second argument to Collections.sort. You'll have to write the logic yourself though (or find a third-party library to do so). I don't think there's anything in the standard libraries to do this. (You'll want to consider case-sensitivity and possibly all kinds of other things.)

Desigur, dacă ai putea schimba datele pentru a fi section_01 , section_02 etc, asta înseamnă că ai putea folosi ordinea naturală de sortare. .

0
adăugat
@NominSim: Tocmai am adăugat același lucru :)
adăugat autor Jon Skeet, sursa
Da, am văzut asta și mi-am șters comentariul haha.
adăugat autor NominSim, sursa

Va trebui să utilizați un comparator personalizat care extrage partea numerică a șirurilor, transformă-le în instanțe întregi și compară acele Integre:

public class SectionComparator implements Comparator() {
    @Override
    public int compare(String s1, String s2) {
        Integer i1 = Integer.valueOf(s1.substring(s1.indexOf('_') + 1));
        Integer i2 = Integer.valueOf(s1.substring(s2.indexOf('_') + 1));
        return i1.compareTo(i2),
    }
}

Dar, în loc să folosiți șiruri pentru a reprezenta secțiuni, puteți utiliza și obiecte Section , care ar avea un atribut numeric, o metodă toString() atribut.

0
adăugat

vedeți, de asemenea, această postare

you need to use The Alphanum Algorithm

Others previously suggested to implement Comparator. here's an implementation

Mult noroc!

0
adăugat