Złe sortowanie w TreeSet

0

Cześć
Mam dwie tablice: A i B z intami. Chciałbym dodać te dwie tablice do TreeSetu, z tym że do każdej liczby będzie doczepiona litera, z której tablicy pochodzi. Czyli np. "1A", "33B" itp. Zrobiłem to tak jak poniżej, lecz problem jest z sortowaniem liczb dwucyfrowych, tzn. 13 ląduje na samym początku, a 55 tam gdzie powinno być 5. Natomiast mi zależy, żeby było najpierw liczby jednocyfrowe, potem dwu, itp.
Czy ja coś źle robię, czy też taki jest mechanizm sortujący TreeSetu?

public void sortowanie() {
        int[] a = {2, 1, 8, 13, 1, 8,55};
        int[] b = {2, 1, 6, 7, 13,55};

        Set<String> ab = new TreeSet<>();
        for (int i = 0; i <a.length ; i++) {
            ab.add(Integer.toString(a[i])+"A");
        }
        for (int i = 0; i <b.length ; i++) {
           ab.add(Integer.toString(b[i])+"B");
        }

        for (String value:ab) {
            System.out.println(value);
        }

    }
      

0

String ma compareTo które porównuje Stringi leksykograficznie. Jedyne co go obchodzi to porównywanie znaków pojedynczo. Nie analizuje czy w danym miejscu zaczyna się wielocyfrowa liczba, data, wyśrodkowanie tekstu czy cokolwiek innego. Jeśli chcesz mieć posortowany zbiór tak jak chcesz to masz wiele opcji, np:

  • zrobienie klasy z polami typu int i String, zaimplementowanie interfejsu Comparable na tej klasie bądź Comparator na osobnej
  • dopełnić liczby zerami z lewej strony, tak by wszystkie liczby miały tę samą długość, np jeśli zdecydujesz się na długość 3 to 5 zamień na 005, 123 zamień na 123, liczby dłuższe niż 3 cyfrowe wywal
  • zrób sprytnego Comparatora ale kod wyjdzie obleśny: https://codereview.stackexchange.com/questions/37192/number-aware-string-sorting-with-comparator zamiast kombinować w ten sposób uprość sobie problem wybierając którąś z poprzednich propozycji
  • zrób SortedMapę (TreeMapę) gdzie kluczem będzie Integer, a wartością Lista Stringów (czyli te "a", "b", itd)
  • itd
0

Wrzucasz do zbioru obiekty typu String, zatem są one domyślnie sortowanie leksykograficznie. Jeśli masz niestandardowe wymagania dot. kryteriów sortowania, musisz napisać własną klasę implementującą interfejs Comparator i podrzucić jej instancję jako argument konstruktora TreeSet:

Set<String> ab = new TreeSet<>(new MyABComparator());
0

Implementując ten komparator musisz chyba rozbić wejściowy string na tokeny - liczbowe i stringowe. Liczbowe porównuj jako inty. To się dość często implementuje, np. przy numeracji wersji. 1.10 ma być większe od 1.9.

1 użytkowników online, w tym zalogowanych: 0, gości: 1