Sortowanie, mieszanie i odwracanie list oraz tablic elementów typu String, Integer, Long etc.

Sortowanie list elementów typu String, Integer etc

Zaczniemy od najprostszego przykładu:

 

ArrayList<String> lista = new ArrayList<>();

lista.add("java");

lista.add("c++");

lista.add("python");

for(String s: lista){

System.out.println(s);

}

Stworzyłem prostą listę elementów klasy String. Dodałem do niej nazwy trzech języków programowania. Zawarta w powyższym kodzie pętla wyświetla elementy w takiej kolejności w jakiej zostały dodane.

Chciałbym je teraz wyświetlić w porządku alfabetycznym. Klasa java.util.Collections udostępnia metodę sort:

 

ArrayList<String> lista = new ArrayList<>();

lista.add("java");

lista.add("c++");

lista.add("python");

Collections.sort(lista);

for(String s: lista){

System.out.println(s);

}

Tym razem nazwy języków zostały wyświetlone alfabetycznie.

Metoda działa analogicznie dla wartości klas Long, Integer etc. Sposób działania dla liczb:

 

ArrayList<Integer> liczby = new ArrayList<>();

liczby.add(9);

liczby.add(6);

liczby.add(12);

liczby.add(-1);

for(Integer i: liczby){

System.out.println(i);

}

Po zastosowaniu metody sort:

 

ArrayList<Integer> liczby = new ArrayList<>();

liczby.add(9);

liczby.add(6);

liczby.add(12);

liczby.add(-1);

Collections.sort(liczby);

for(Integer i: liczby){

System.out.println(i);

}

 

Odwracanie list i sortowanie malejące

Klasa Collections udostępnia również metodę reverse odwracającą zawartość list. Można ją zastosować np do uzyskania sortowania malejącego:

 

ArrayList<Integer> liczby = new ArrayList<>();

liczby.add(9);

liczby.add(6);

liczby.add(12);

liczby.add(-1);

Collections.sort(liczby);

Collections.reverse(liczby);

for(Integer i: liczby){

System.out.println(i);

}

Najpierw sortujemy listę (domyślnie rosnąco), a następnie odwracamy przy użyciu metody reverse czego efektem jest posortowanie listy malejąco:

W taki sam sposób możemy odwracać listy składające się z bardziej złożonych obiektów:

 

class Zlozona {

Integer pole1;

String pole2;

Zlozona(Integer p1, String p2) {

pole1 = p1;

pole2 = p2;

}

public String toString() {

return "Zlozona{" + "pole1=" + pole1 + ", pole2=" + pole2 + '}';

}

}

ArrayList<Zlozona> listaZ = new ArrayList<>();

listaZ.add(new Zlozona(1, "Telewizor"));

listaZ.add(new Zlozona(2, "Pralka"));

listaZ.add(new Zlozona(3, "Bulbulator"));

Collections.reverse(listaZ);

for(Zlozona z: listaZ){

System.out.println(z);

}

Efekt działania:

Niestety przy tego typu obiektach (nie będących po prostu obiektem klasy opakowującej typ prosty) nie działa sortowanie omówione chwilę temu. Wynika to z tego że Java po prostu nie wie jak ma sortować takie elementy. Będziemy musieli jej przygotować odpowiednią metodę porównującą elementy aby można było sortować takie listy. Jeśli chcesz się dowiedzieć jak to robić, zapraszam Cię do zapoznania się z osobnym artykułem poświęconym temu tematowi.

 

Mieszanie zawartości list

Klasa Collections udostępnia również ciekawą metodę shuffle, której działanie sprowadza się do losowej zmiany kolejności elementów zawartych w liście przekazanej przez parametr.

 

ArrayList<Integer> liczby = new ArrayList<>();

liczby.add(9);

liczby.add(6);

liczby.add(12);

liczby.add(-1);

Collections.shuffle(liczby);

for(Integer i: liczby){

System.out.println(i);

}

Po uruchomieniu powyższego kodu (zrób to kilkukrotnie) otrzymasz listę elementów wyświetloną w pomieszanej kolejności. Metodę shuffle można wykorzystywać również w przypadku typów złożonych w taki sam sposób.

 

Sortowanie tablic elementów typów String, Long etc.

Sortowanie tablic odbywa się na bardzo zbliżonych zasadach do sortowania list. Zacznijmy od zdeklarowania tablicy elementów typu String:

 

String[] tab = {"pieczarka","kalafior","nietoperz"};

for(String s: tab){

System.out.println(s);

}

Uruchomienie powyższego kodu spowoduje wyświetlenie elementów w takiej kolejności w jakiej zostały dodane:

Jeśli chcemy je posortować stosujemy metodę sort – tyle że tym razem klasy Arrays:

 

String[] tab = {"pieczarka","kalafior","nietoperz"};

Arrays.sort(tab);

for(String s: tab){

System.out.println(s);

}

Metoda ta posortuje dane w tablicy w porządku alfabetycznym:

Niestety klasa Arrays nie udostępnia metod reverse i shuffle tak jak klasa Collections. Można odwracanie i mieszanie tablic zrealizować samemu oprogramowując odpowiedni algorytm, albo przepakować dane do listy, dokonać odpowiednich działań, po czym znów przypisać do tablicy np:

 

String[] tab = {"pieczarka", "kalafior", "nietoperz"};

Arrays.sort(tab);

List<String> lista = Arrays.asList(tab);

Collections.reverse(lista);

tab=(String[])lista.toArray();

for (String s : tab) {

System.out.println(s);

}

 

Kod źródłowy :

http://jsystems.pl/static/download/blog/java/ListyExt.zip

 

Ten artykuł jest elementem poniższych kursów: