Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 2
  • 48

Witam.

Zastanawiam się nad zagadnieniem wstawiania obiektów do posortowanej kolekcji. Wstawiając takie obiekty, są one dostępne do modyfikacji z zewnątrz. Jak zareaguje struktura kiedy faktycznie obiekt którym zarządza zostanie zmieniony? 

Rafał_Kędzierski
  • Zapytał
  • @ Rafał_Kędzierski | 16.02.2016
    • lider
    • laureat
    • 39
    • 6
    • 46

Odpowiedź (1)

  • 7

W przedstawionym przypadku modyfikacja stanu obiektu przechowywanego w posortowanej kolekcji spowoduje, że kolekcja przestanie być posortowana...

Można to zilustrować na następującym przykładzie:

Załóżmy, że obiektami przechowywanymi w kolekcji będą obiekty klasy Osoba:

public class Osoba implements Comparable<Osoba> {
  private String imie;
  private String nazwisko;

  public Osoba(String imie, String nazwisko) {
    this.imie = imie;
    this.nazwisko = nazwisko;
  }

  public String getImie() {
    return imie;
  }

  public void setImie(String imie) {
    this.imie = imie;
  }

  public String getNazwisko() {
    return nazwisko;
  }

  public void setNazwisko(String nazwisko) {
    this.nazwisko = nazwisko;
  }

  @Override
  public String toString() {
    return imie + " " + nazwisko;
  }

  @Override
  public int compareTo(Osoba o) {
    int porzadek = this.getNazwisko().compareTo(o.getNazwisko());
    if (porzadek != 0) {
      return porzadek;
    }
    return this.getImie().compareTo(o.getImie());
  }

}

Test wygląda następująco:

public class SortTest {

  public static void main(String[] args) {
    Osoba o1 = new Osoba("Jan", "Kowalski");
    Osoba o2 = new Osoba("Janusz", "Kowalski");
    Osoba o3 = new Osoba("Adam", "Kowalski");
    Osoba o4 = new Osoba("Adam", "Kowal");

    List<Osoba> kolekcja = new ArrayList<>();
    kolekcja.add(o1);
    kolekcja.add(o2);
    kolekcja.add(o3);
    kolekcja.add(o4);

    Collections.sort(kolekcja); // sortowanie kolekcji
    System.out.println(kolekcja); // wypisanie zawartości kolekcji

    o3.setImie("Tadeusz"); // modyfikacja stanu jednego z obiektów
    System.out.println(kolekcja); // wypisanie zawartości kolekcji

    Collections.sort(kolekcja); // ponowne sortowanie kolekcji
    System.out.println(kolekcja); // wypisanie zawartości kolekcji
  }

}

Wynik uruchomienia testu:

[Adam Kowal, Adam Kowalski, Jan Kowalski, Janusz Kowalski]
[Adam Kowal, Tadeusz Kowalski, Jan Kowalski, Janusz Kowalski]
[Adam Kowal, Jan Kowalski, Janusz Kowalski, Tadeusz Kowalski]

Jest to spowodowane tym, że modyfikacja stanu obiektu o3  nie powoduje automatycznego uruchomienia sortowania...

Zamiana na inny typ kolekcji też niczego nie zmieni. Jeśli zastąpimy kolekcję ArrayList  zbiorem  TreeSet, to elementy będą porządkowane automatycznie w czasie wstawiania, ale nie modyfikacji. Można się o tym przekonać poprzez następujący test:

public class SortTest {

  public static void main(String[] args) {
    Osoba o1 = new Osoba("Jan", "Kowalski");
    Osoba o2 = new Osoba("Janusz", "Kowalski");
    Osoba o3 = new Osoba("Adam", "Kowalski");
    Osoba o4 = new Osoba("Adam", "Kowal");

    Set<Osoba> kolekcja = new TreeSet<>();
    kolekcja.add(o1);
    kolekcja.add(o2);
    kolekcja.add(o3);
    kolekcja.add(o4);

    System.out.println(kolekcja); // wypisanie zawartości kolekcji

    o3.setImie("Tadeusz"); // modyfikacja stanu jednego z elementów
    System.out.println(kolekcja); // wypisanie zawartości kolekcji
  }

}

Wynik testu jest zbieżny z poprzednim:

[Adam Kowal, Adam Kowalski, Jan Kowalski, Janusz Kowalski]
[Adam Kowal, Tadeusz Kowalski, Jan Kowalski, Janusz Kowalski]

 

 

 

 

 

 

 

 

 

  • Odpowiedział
  • @ | 17.02.2016
  • TRENER MODERATOR ALTKOM AKADEMII