sortoawanie zestawienia wg. trzech zmiennych( TreeMap)

0

Witam, mianowicie mam do wykonania zestawienie 10 zmiennych (wszystkie to String) , które można sortować wg trzech zmiennych. Jedną zmienną, która się nie powtarza wrzuciłem w ArrayList i posortowałem, następnie zawartość listy wyświetlam w ComboBoxie. dla pozostałych zmiennych utworzyłem listy par w TreeMap i wyświetlam w poszczególnych jTextField, odwołując się do zawartości ComboBoxa. Rozwiązanie to jednak pozwala mi przeglądać zestawienie wg. jednej zmiennej, a potrzebuję przeglądać je wg. trzech zmiennych. a ponieważ pozostałe dwie zmienne mogą się powtarzać to chyba używanie jTextField odpada ponieważ nie wyświetlę w nim jednocześnie kilkunastu zmiennych odpowiadających wybranej zmiennej, wg której chcę przeglądać zestawienie. Nie mogę używać żadnych zestawień typu sql. liczę na jakąś radę jak rozwiązać problem przeglądania zestawienia wg trzech zmiennych i wyświetlania jego zawartości.

0

Prawdę mówiąc tylko domyślam się co chcesz zrobić, bo z tekstu nie do końca to rozumiem. Ale może się uda coś wymyślić. Jeżeli masz 10 stringów, to połącz je w jeden obiekt, a te obiekty umieść w wektorze. Teraz możesz sortować wektor metodą sort z klasy Collections. Kwestia napisania odpowiedniego komparatora. Możesz zrobić to tak, że konstruktor tego komparatora przyjmuje parametr określający po którym polu ma sortować. Co prawda nie wiem, czy to jest celem, ale jak nie, to będzie prościej. Żeby sortować jednocześnie po trzech polach musisz zaimplementować komparator tak, aby w przypadku, gdy jedno pole jest identyczne zaczynał porównywać kolejne.
Co do wyświetlania, to chyba sama tutaj nasuwa się do tego JTable. Dopiszesz implementację modelu opartą o posortowany wektor obiektów i masz już wszystko. Możesz jeszcze dodać sortowanie po kliknięciu w nagłówek.

0

Więc zrobiłem podobnie jak piszesz, wczytane dane z plików w odpowiednich klasach przechowuję w HashMapach, tak aby kluczem były kolumny pozwalające łączyć dane, poza kolekcją fak, która to jest ArrayListą i od której użależniam wyświetlanie zestawienia, oto kod:

public class zest {
    
    public zest(){
        
    }
        
    public zest(String NRKARTY, String DATAD, String KOD, String MASA, String JEDN, String FIRMA, String TYP, String NR_KLIENTA, String NR_MAG, String OPIS){
      
        this.NRKARTY = NRKARTY;  
        this.DATAD = DATAD;
        this.KOD = KOD;
        this.MASA = MASA;
        this.JEDN = JEDN;
        this.FIRMA = FIRMA;
        this.TYP = TYP;
        this.NR_KLIENTA = NR_KLIENTA;
        this.NR_MAG = NR_MAG;
        this.OPIS = OPIS;
    }
    
    String NRKARTY = CzytajMagazynp.fak.get(n);
    String DATAD = CzytajMagazynp.dat.get(CzytajMagazynp.fak.get(n));
    String KOD = CzytajSlownik.kod.get(CzytajMagazynp.odp.get(CzytajMagazynp.fak.get(n)));
    String MASA = CzytajMagazynp.mas.get(CzytajMagazynp.fak.get(n));
    String JEDN = CzytajMagazynp.jed.get(CzytajMagazynp.fak.get(n));
    String FIRMA = CzytajMagazynp.fir.get(CzytajMagazynp.fak.get(n));
    String TYP = CzytajSlownik.typ.get(CzytajMagazynp.odp.get(CzytajMagazynp.fak.get(n)));
    String NR_KLIENTA = CzytajDostawcy.d.get(CzytajMagazynp.nkl.get(CzytajMagazynp.fak.get(n)));
    String NR_MAG = CzytajMagazynp.mag.get(CzytajMagazynp.fak.get(n));
    String OPIS = CzytajSlownik.opis.get(CzytajMagazynp.odp.get(CzytajMagazynp.fak.get(n)));
    
    public static int n = 0;
    
    public String getNRKARTY(){
        return CzytajMagazynp.fak.get(n);
    }
    
    public String getDATAD(){
        return CzytajMagazynp.dat.get(CzytajMagazynp.fak.get(n));
    }
    
    public String getKOD(){
        return CzytajSlownik.kod.get(CzytajMagazynp.odp.get(CzytajMagazynp.fak.get(n)));
    }
    
    public String getMASA(){
        return CzytajMagazynp.mas.get(CzytajMagazynp.fak.get(n));
    }
    
    public String getJEDN(){
        return CzytajMagazynp.jed.get(CzytajMagazynp.fak.get(n));
    }
    
    public String getFIRMA(){
        return FIRMA = CzytajMagazynp.fir.get(CzytajMagazynp.fak.get(n));
    }
    
    public String getTYP(){
        return CzytajSlownik.typ.get(CzytajMagazynp.odp.get(CzytajMagazynp.fak.get(n)));
    }
    
    public String getNR_KLIENTA(){
        return CzytajDostawcy.d.get(CzytajMagazynp.nkl.get(CzytajMagazynp.fak.get(n)));
    }
    
    public String getNR_MAG(){
        return CzytajMagazynp.mag.get(CzytajMagazynp.fak.get(n));
    }
    
    public String getOPIS(){
        return CzytajSlownik.opis.get(CzytajMagazynp.odp.get(CzytajMagazynp.fak.get(n)));
    }
    
    @Override
    public String toString(){
       return getNRKARTY() + getDATAD() + getKOD() + getMASA() + getJEDN() + getFIRMA() + getTYP() + getNR_KLIENTA() + getNR_MAG() + getOPIS(); 
    }
       
    public void drukuj(){
        for(;n <= CzytajMagazynp.fak.size(); n++)
        {
        System.out.println(n + "    " + getNRKARTY() +" " + getKOD() + " " + getDATAD() + " " + getMASA() + " " + getJEDN() + " " + getFIRMA() +" " + getTYP() + " " +getNR_KLIENTA() + " " + getNR_MAG() + " " + getOPIS());
        }
    }
}

class zestawienie{
    
    ArrayList<zest> zestaw1 = new ArrayList<zest>();
    zest zz = new zest();
    public void pętla(){
     
                for(;zest.n <= CzytajMagazynp.fak.size(); zest.n++){
            zestaw1.add(zz.getNRKARTY(),zz.getDATAD(),zz.getKOD(),zz.getMASA(),zz.getJEDN(),zz.getFIRMA(),zz.getTYP(),zz.getNR_KLIENTA(),zz.getNR_MAG(),zz.getOPIS());
        }
        System.out.println(zestaw1);
    }
    
}

i teraz pytanie co robię nie tak, ponieważ metoda drukuj działa, a podczas tworzenia zestawienia ArrayList, które stosuje zamiast vektor kompilator zwraca mi taki komunikat:

/home/pawel/Desktop/JavaApplication28/src/javaapplication28/zest.java:107: cannot find symbol
symbol  : method add(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)
location: class java.util.ArrayList<javaapplication28.zest>
            zestaw1.add(zz.getNRKARTY(),zz.getDATAD(),zz.getKOD(),zz.getMASA(),zz.getJEDN(),zz.getFIRMA(),zz.getTYP(),zz.getNR_KLIENTA(),zz.getNR_MAG(),zz.getOPIS());
0

Kompilator ci napisał, że nie ma mteody add w klasie ArrayList, która przyjmuje 10 argumentów typu String. To może być tak:

zest z=new zest(zz.getNRKARTY(),zz.getDATAD(),zz.getKOD(),zz.getMASA(),zz.getJEDN(),zz.getFIRMA(),zz.getTYP(),zz.getNR_KLIENTA(),zz.getNR_MAG(),zz.getOPIS());
zestaw1.add(z);

Czyli dodaj gotowy obiekt do listy.
Ponadto troszkę to jeszcze dziwne jest. Klasa zest nie ma pola n. To własnie te obiekty masz dodać do listy. Nie wiem skąd czytasz te dane, ale po przeczytaniu linii zapamiętujesz kolumny w nowym obiekcie zest i dodajesz go do zestaw1, tak to ma być. Jak zadziała, to się będzie elegancko sortować.

0

Dzięki, teraz zestawienie się tworzy, jednak zastanawiam się w jaki sposób miałbym wskazywać pole wg. którego ma odbywać się sortowanie tabeli, poza tym mam problem z wrzuceniem zestawienia do tabeli, sortowanie powinno być możliwe wg. zmiennej kod, firma i nrkarty, nie bardzo wiem jak się do tego dobrać, mam:

public class zest {
    
    public zest(){
        
    }
        
    public zest(String NRKARTY, String DATAD, String KOD, String MASA, String JEDN, String FIRMA, String TYP, String NR_KLIENTA, String NR_MAG, String OPIS){
      
        this.NRKARTY = NRKARTY;  
        this.DATAD = DATAD;
        this.KOD = KOD;
        this.MASA = MASA;
        this.JEDN = JEDN;
        this.FIRMA = FIRMA;
        this.TYP = TYP;
        this.NR_KLIENTA = NR_KLIENTA;
        this.NR_MAG = NR_MAG;
        this.OPIS = OPIS;
    }
    
    String NRKARTY = CzytajMagazynp.fak.get(n);
    String DATAD = CzytajMagazynp.dat.get(CzytajMagazynp.fak.get(n));
    String KOD = CzytajSlownik.kod.get(CzytajMagazynp.odp.get(CzytajMagazynp.fak.get(n)));
    String MASA = CzytajMagazynp.mas.get(CzytajMagazynp.fak.get(n));
    String JEDN = CzytajMagazynp.jed.get(CzytajMagazynp.fak.get(n));
    String FIRMA = CzytajMagazynp.fir.get(CzytajMagazynp.fak.get(n));
    String TYP = CzytajSlownik.typ.get(CzytajMagazynp.odp.get(CzytajMagazynp.fak.get(n)));
    String NR_KLIENTA = CzytajDostawcy.d.get(CzytajMagazynp.nkl.get(CzytajMagazynp.fak.get(n)));
    String NR_MAG = CzytajMagazynp.mag.get(CzytajMagazynp.fak.get(n));
    String OPIS = CzytajSlownik.opis.get(CzytajMagazynp.odp.get(CzytajMagazynp.fak.get(n)));
    
    public static int n = 0;
    
    public String getNRKARTY(){
        return CzytajMagazynp.fak.get(n);
    }
    
    public String getDATAD(){
        return CzytajMagazynp.dat.get(CzytajMagazynp.fak.get(n));
    }
    
    public String getKOD(){
        return CzytajSlownik.kod.get(CzytajMagazynp.odp.get(CzytajMagazynp.fak.get(n)));
    }
    
    public String getMASA(){
        return CzytajMagazynp.mas.get(CzytajMagazynp.fak.get(n));
    }
    
    public String getJEDN(){
        return CzytajMagazynp.jed.get(CzytajMagazynp.fak.get(n));
    }
    
    public String getFIRMA(){
        return FIRMA = CzytajMagazynp.fir.get(CzytajMagazynp.fak.get(n));
    }
    
    public String getTYP(){
        return CzytajSlownik.typ.get(CzytajMagazynp.odp.get(CzytajMagazynp.fak.get(n)));
    }
    
    public String getNR_KLIENTA(){
        return CzytajDostawcy.d.get(CzytajMagazynp.nkl.get(CzytajMagazynp.fak.get(n)));
    }
    
    public String getNR_MAG(){
        return CzytajMagazynp.mag.get(CzytajMagazynp.fak.get(n));
    }
    
    public String getOPIS(){
        return CzytajSlownik.opis.get(CzytajMagazynp.odp.get(CzytajMagazynp.fak.get(n)));
    }
    
    @Override
    public String toString(){
       return getNRKARTY() + getDATAD() + getKOD() + getMASA() + getJEDN() + getFIRMA() + getTYP() + getNR_KLIENTA() + getNR_MAG() + getOPIS(); 
    }
       public static ArrayList<zest> zestaw1 = new ArrayList<zest>();
    public void drukuj(){

        zest z = new zest(getNRKARTY(),getDATAD(),getKOD(),getMASA(),getJEDN(),getFIRMA(),getTYP(),getNR_KLIENTA(),getNR_MAG(),getOPIS());
        
        while(n != CzytajMagazynp.fak.size() -1)
        {
                n++;
             zestaw1.add(z);
          }
            System.out.println(zestaw1.size());

    }
}

i do tego tabele

public class model_tab1 extends AbstractTableModel{

        public static ArrayList<zest> zestawionko;
    
    
    public model_tab1(ArrayList<zest> zestawionko) {
        this.zestawionko = zestawionko;
    }
    
    
    
    
    public int getRowCount() {
        return zestawionko.size();
    }

    public int getColumnCount() {
        return 10;
    }

    @Override
     public String getColumnName(int nz) {
         switch(nz) {
                case 0:
                    return "NRKARTY";
                case 1:
                    return "DATAD";
                case 2:
                    return "KOD";
                case 3:
                    return "MASA";
                case 4:
                    return "JEDN";
                case 5:
                    return "FIRMA";
                case 6:
                    return "TYP";
                case 7:
                    return "NR_KLIENTA";
                case 8:
                    return "NR_MAG";
                case 9:
                    return "OPIS";
                default:
                    return "NIC";
    
         }
    
    }
    
    
    public Object getValueAt(int row, int col) {
        zest temp = zestawionko.get(row);
       if(col==0)
           return temp.getNRKARTY();
          else if(col==1)
          return temp.getDATAD();
          else if(col==2)
              return temp.getKOD();
          else if(col==3)
              return temp.getMASA();
          else if(col==4)
              return temp.getJEDN();
          else if(col==5)
              return temp.getFIRMA();
          else if(col==6)
              return temp.getTYP();
          else if(col==7)
              return temp.getNR_KLIENTA();
          else if(col==8)
              return temp.getNR_MAG();
          else if(col==9)
              return temp.getOPIS();
          return null;
    }

}

tym sposobem cała tabela jest wypełniona wartościami dla 0 indexu

0

zastanawiam się w jaki sposób miałbym wskazywać pole wg. którego ma odbywać się sortowanie tabeli

Wskazanie pola możesz zrobić jak chcesz, np. przez kliknięcie na nagłówek kolumny. W obsłudze zdarzenia wywołasz jakąś metodę ze swojej klasy komparatora, która to metoda ustawi pole w komparatorze. Na podstawie tego pola w komparatorze będzie wybierane pole z klasy zest, które ma być porównywane.
Wrzucenie zestawienia do tabeli trzeba zrobić dokładnie tak jak robisz, nie wiem czemu masz tylko pierwszy wiersz. Jak przypiszesz ten model do tabeli to powinno działać, popatrz w kod, może znajdziesz jakiś drobny błąd, pewnie w indeksach.
Napisz jakiś komparator i wklej, to się zobaczy co tam można zmienić, żeby działał jak tak jak powinien.

0

dzięki za pomoc, wreszcie działa tak jak powinno. Ale teraz mam inny problem mam ArrayList obiektów składających się z siedmiu stringów, bez problemu mogę wrzucić to w tabelkę ale cały knyf tkwi w w tym że pierwszy String co któryś obiekt się powtarza, a zestawienie ma wyglądać tak że wartości w pierwszej kolumnie się nie powtarzają a odpowiadające im wartości w pozostałych kolumnach trzeba by przeparsować na double i zsumować tylko nie bardzo wiem jak :/

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