Treeset nie sortuje drugiego warunku

0

Cześć programiści mam zadanie posortować metodą TreeSet monitory według ceny oraz rozdzielczości w przypadku LinkedList wszystko sortowało się bez problemu jednak na TreeSet sortuje tylko cenami. Przeszukałem ksiazki internet czy nasze forum i nie byłem w stanie tego naprawić załączam kod dla lepszego zobrazowania:

Mój main:

package test2_treeset;


public class Test2_treeset {

 
    public static void main(String[] args) {
      
        
        Allegro allegro = new Allegro();
        
        allegro.add(new Monitor("Dell", 65, 5000));
        allegro.add(new Monitor("Apple", 9.5, 6000));
        allegro.add(new Monitor("Dell", 2.5, 100));
        allegro.add(new Monitor("Samsung", 5.5, 4000));
        allegro.add(new Monitor("Dell", 1.5, 3000));
        allegro.add(new Monitor("Intel", 0.5, 2000));
        
        
         System.out.println("Cenami\n");
         
         allegro.Cenami();
         System.out.println("------------------------------------\n");
         
         
         System.out.println("Rozdzielczosciami:\n");
         allegro.Rozdz();
  }
    
}
 

Klasa Monitor

package test2_treeset;

/* implements Comparable<Monitor>*/
public class Monitor implements Comparable<Monitor>
{
    private String firma;
    private double resolution;
    private double cena;

    public Monitor() {
        this.firma = "nieznana";
        this.resolution = 0.0;
        this.cena = 0;
    }

    public Monitor(String firma, double resolution, double cena) {
        this.firma = firma;
        this.resolution = resolution;
        this.cena = cena;
    }

    String getFirma() {
        return this.firma;
    }

    double getCena() {
        return this.cena;
    }

    double getResolution() {
        return this.resolution;
    }

    void Show() {
        System.out.println("Monitor: " + this.firma + " Rozdzielczosc: " + this.resolution + " Cena: " + this.cena);
    }
    

    @Override
    public int compareTo(Monitor o) {
       
     if(this.cena>o.cena)
     {
         return 1;
     }
        
          else if(this.cena<o.cena)
     {
         return -1;
     }
        else
     {
                       if(this.resolution>o.resolution)
                       {
                           return 1;
                       }
        
                       else if(this.resolution<o.resolution)
                       {
                           return -1;
                       }
                       else
                       {
                           return 0;
                       }
     }
    }
    }
 

Klasa Allegro

package test2_treeset;

import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.TreeSet;

public class Allegro {
   // LinkedList<Monitor> list;
    Iterator<Monitor> iterator;
    TreeSet<Monitor> treeset;

    public Allegro() {
        this.treeset = new TreeSet<>();
    }

    void add(Monitor monitor) {
        this.treeset.add(monitor);
    }
    

    void Cenami() {
        iterator = treeset.iterator();
        while (iterator.hasNext()) {
            iterator.next().Show();
        }

    }

    void Rozdz() {

        
        //Collections.sort(lista);
      

        class Rozdzielczosciami implements Comparator<Monitor> {

            @Override
            public int compare(Monitor o1, Monitor o2) {
            if (o1.getResolution() > o2.getResolution())
            {
                return 1;
            }
            else if (o1.getResolution() < o2.getResolution())
            {
                return -1;
            }
            else
            {
                return 0;
            }
            
        }
        

        }
          iterator = treeset.iterator();
        while (iterator.hasNext()) {
            iterator.next().Show();
        }

    }

}
 
0
  1. TreeSet to kontener a nie metoda sortowania
  2. To co zrobiłeś w ogóle nie ma sensu. Zdefiniowałeś sobie jakąś klasę wewnętrzną a potem nigdzie jej nie użyłeś i się dziwisz że coś nie działa. Żeby to miało sens to musisz utworzyć NOWY tree set podając komparator jako argument https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html#TreeSet(java.util.Comparator)
0

Czy mam go utworzyć w klasie Allegro czy w mainie ?

0

To już zależy od tego co dokładnie chcesz osiągnąć.

0

TreeSet implementuje SortedSet. SortedSeta się nie sortuje żadną specjalną metodą, bo on jest cały czas posortowany.

TreeSet ma kilka konstruktorów. Jeśli podasz mu w konstruktorze Comparator to TreeSet będzie używał tego Comparatora do porównywania elementów i ustalania kolejności. Jeśli nie podasz Comparatora to TreeSet zastosuje 'natural ordering' czyli będzie wymagał od wstawianych elementów by implementowały interfejs Comparable i będzie używał metody compareTo z tego interfejsu by porównywać elementy.

Comparator podany jako argument do konstruktora w TreeSecie ma pierwszeństwo nad 'natural ordering'. TreeSet ignoruje 'natural ordering' jeśli podasz mu Comparatora explicite. To jest przydatne, gdy jako 'natural ordering' ustawiłeś jakieś globalnie sensowne porównanie (i prawie wszędzie jest ono używane, tzn używasz prawie wszędzie TreeSet bez Comparatora podanego explicite w konstruktorze), ale w pewnym miejscu w kodzie chcesz użyć jednak czegoś innego (bo masz specyficzne wymaganie w tym miejscu).

0

Sortowanie według dwoch wartosci, wiem ze to dla Ciebie tak łatwe ze jestes w szoku mozna tego nie umieć, ale naprawde uratujesz mój dzień :)

0

Wrzuć kod na ideone.com tak by się skompilował, odpalił i byśmy zobaczyli co się dzieje.

0

Nie mozna miec tam chyba klas zewnetrznych

0

A ja bym powiedział, że można. Nie mogą być tylko public.

http://ideone.com/ReuRFZ

0

Masz racje działa.
http://ideone.com/2RpHUG

1

Primo ultimo:
Formatowanie jest skopane. Widać, że masz nas w poważaniu. Odpal normalne IDE i sformatuj kod automatycznie (Eclipse, NetBeans i IntelliJ formatują kod jednym kliknięciem).

Poza tym to teraz problem widać jak na dłoni. W obu metodach po prostu wypisujesz zawartość TreeSeta po kolei, więc dostajesz to samo. Klasa Rozdzielczosciami nie jest używana. Możesz np zmienić:

iterator = treeset.iterator();
while (iterator.hasNext()) {
    iterator.next().Show();
}

Na:

TreeSet<Monitor> rozdzielczosciami = new TreeSet<>(new Rozdzielczosciami());
rozdzielczosciami.addAll(treeset);
iterator = rozdzielczosciami.iterator();
while (iterator.hasNext()) {
    iterator.next().Show();
}

Ten sposób ma tę potencjalną wadę, że konstruujesz za każdym razem nowego TreeSeta tylko po to, by go wypisać. Teoretycznie lepsze byłoby stworzenie tablicy i jej posortowanie, ale skoro to tylko ćwiczenie to można to (zabawę z TreeSetem) uznać za wystarczające.

0

Mistrz jesteś to działa nie uwierzysz że 3 dni nad tym siedziałem. Będę pamietał o twoich radach odnośnie formatowania. Dziękuje jeszcze raz :)

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