Sortowanie własnych typów.

Sortowanie własnych typów.
BA
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Wrocław
  • Postów:259
0

Cześć.
Mam własny typ który składa się z dwóch intów. Chciałbym go posortować najpierw wg pierwszego inta, a następnie sortować "wewnętrznie" wg drugiego inta. Wyglądało by to tak. Weźmy pray: (2,4),(1,3),(1,2),(2,2),(3,1),(3,0) Najpierw sortujemy wg pierwszego i dostajemy coś takiego: (1,3),(1,2),(2,4),(2,2),(3,1),(3,0) Następnie wg drugiego ```
(1,2),(1,3),(2,2),(2,4),(3,0),(3,1)

Kopiuj
```java
public class Test {

    private int a;
    private int b;

    public Test(int a, int b) {
        this.a = a;
        this.b = b;
    }

    public int getA() {
        return a;
    }

    public int getB() {
        return b;
    }

    @Override
    public String toString() {
        return a + " " + b;
    }

    public static void main(String[] args) {
        List<Test> testList = new LinkedList<>();

        ThreadLocalRandom current = ThreadLocalRandom.current();

        for (int i = 0; i < 10; i++) {
            testList.add(new Test(current.nextInt(0, 10), current.nextInt(0, 10)));
        }

        testList.forEach(System.out::println);

        testList.sort(Comparator.comparingInt(Test::getA));

        System.out.println("---");
        testList.forEach(System.out::println);
    }
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Napisz własną metodę porównującą (własny comparator).


edytowany 1x, ostatnio: Patryk27
BA
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Wrocław
  • Postów:259
0

Eh tyle męczenia, aż tu nagle eureka :)

samouczek
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 7 lat
  • Postów:67
0

Niech Twoja klasa zaimplementuje interfejs Comparable. Przykład poniżej:

Kopiuj
@Override
public int compareTo(Test other) {
    if (other == null) {
        return 1;
    }
    if (a == other.a) {
        return b - other.b;
    }
    return a - other.a;
}

Wtedy będziesz mógł sortować te obiekty używając Collections.sort bez podawania "komparatora". Jeśli wolisz wersję z komparatorem, implementacja może być podobna do metody wyżej.

edytowany 1x, ostatnio: samouczek
BA
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Wrocław
  • Postów:259
0

Zrobiłem tak

Kopiuj
testList.sort((o1, o2) -> {
            if (o1.getA() == o2.getA())
                return o1.getB() - o2.getB();
            else
                return o1.getA() - o2.getA();
        });
edytowany 1x, ostatnio: barslo
airborn
Co jest mniej więcej tożsame z Comparator.comparing(Test::getA).thenComparing(Test::getB) sam oceń co jest czytelniejsze.
V-2
else w twoim kodzie jest zbędny.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.