Sortowanie Collections, ArrayList

0

Witam mam taki problem.
Mam klase Tytuly przechowywujaca ksiazki, w ktorej chce sortowac dane po nazwiskach i imieniach.
W klasie uchwyt przetwarzam dane, m.in. sortuje, wypisuje dane na ekran itd.
W klasie wypisz wypisuje dane.
Problem polega na tym ze jezeli, na rzecz obiektu uchwyt (w klasie wypisz) wywolam funkcje sortuj(), to dane w zasadzie sa posortowane, ale jezeli wywolam funkcje wyswietlTytuly() po funkcji sortuj() to wyswietlaja sie nie posortowane tytuly.

 
public class Tytuly implements Comparable<Tytuly> 
{
    private String imie;
    private String nazwisko;
    private String tytul;
    private int ISBN;
    ArrayList<Ksiazka> lista_ksiazka = new ArrayList<Ksiazka>();

    public int compareTo(Tytuly obj) 
    {
        int zmienna = getNazwisko().compareTo(obj.getNazwisko());
                
        if(zmienna == 0)
            zmienna = getImie().compareTo(obj.getImie());
        
        
        return zmienna;
    }
 
public class Uchwyt 
{
    ArrayList <Tytuly> lista_tytuly = new ArrayList<Tytuly>();
    public String wyswietlTytuly()
    {
        String s = "";
        for(int i = 0; i < getRozmiar() ; i++)
        {
            s += "[ " + i + " ]    " + getLista().get(i).toString() + "\n";
        }
        return s;
    }
    public void sortuj(int kryterium)
    {
        if(kryterium == 1)
            Collections.sort(getLista());
        
                
        if(kryterium == 2)
            Collections.sort(lista_tytuly , new SortujTytulPoTytul());
        
        if(kryterium == 3)
            Collections.sort(lista_tytuly, new SortujTytulPoISBN());
    }
public class Wypisz 
{
    public static void main(String[] args) throws IOException
    {
        Uchwyt uchwyt = new Uchwyt();
        uchwyt.dodajTytul("Stanislaw", "Wyspianski", "Wesele" , 1);
        uchwyt.dodajTytul("Henryk", "Sienkiewicz", "Potop" , 2);
        uchwyt.dodajTytul("Boleslaw", "Prus", "Lalka", 3);
        
        String elo = uchwyt.wyswietlTytuly();
        System.out.println(elo);
        uchwyt.sortuj(1);
        System.out.println(elo);
}

Jezeli zrobie tak w klasie uchwyt, to wypisze dane posortowane. Jak zrobic, aby posortowane dane od chwili wywolania funkcji sortuj() byly 'zapisane' w arrayliscie lista_tytuly i od tej chwili kazde operacje na tej arrayliscie dotycza juz posortowanych danych np. wywolanie funkcji wyswietlTytuly() wyswietla mi sie juz posortowane dane ?

public class Uchwyt 
{
    public void sortuj(int kryterium)
    {
        if(kryterium == 1)
            Collections.sort(getLista());
            for(Tytuly zmienna : lista_tytuly)
                System.out.println(zmienna);
        
                
        if(kryterium == 2)
            Collections.sort(lista_tytuly , new SortujTytulPoTytul());
        
        if(kryterium == 3)
            Collections.sort(lista_tytuly, new SortujTytulPoISBN());
    }
}

Będę wdzięczny za każdą pomoc.

0

Jeśli dobrze cię rozumiem, to tak sie właśnie dzieje. Collections.sort() sortuje podaną listę. Nie ma takiej możliwości że nagle ci się znów "psuje" kolejność tej posortowanej tablicy.
BTW poymyśl o sensownym nazywaniu klas, bo teraz to jest jakis WTF. Nie wiem czemu Tytuły to nie jest Tytuł. Nie do końca rozumiem czemu Tytuł przechowuje listę Książek i aż boję sie mysleć skad ten Uchwyt ;]

0

Może lekko wytłumacze.
W tym programie klasa Ksiazak - klasa stworzona po to by przechowywac numer ksiazki
Klasa tytul - klasa przechowuje dane o tytule tj: imie, nazwisko autora, tytul i ISBN oraz tablice obiektow ksiazka( poniewaz jeden tytul moze być przypisany do wielu egzemplarzy ksiazek , ale kazda z tych ksiazek musi miec inny numer)
Uchwyt - klasa przetwarzajaca jedynie dane.
Problem dalej pozostaje ten sam :)

0

Niemożliwe. Chyba że twoje getLista() zwraca jakąś kopie ;]

0

public class Ksiazka
{
    private int numer;
    public Ksiazka(){}
    private Tytuly tytuly;
    
    public void setNumer(int zmienna)
    {
        numer = zmienna;
    }
    public int getNumer()
    {
        return numer;
    }
    
    public void setTytuly(Tytuly obj)
    {
        tytuly = obj;
    }
    
    public boolean equals(Object obj)
    {
        Ksiazka obj1 = (Ksiazka) obj;
        
        if(getNumer() == obj1.getNumer())
            return true;
        
        return false;
    }
    
    public String toString()
    {        
        String pom = tytuly.toString();                        
        pom += " Numer ksiazki: " + getNumer();                                 
        return pom;    
    }

}
import java.util.ArrayList;

public class Tytuly implements Comparable<Tytuly> 
{
    private String imie;
    private String nazwisko;
    private String tytul;
    private int ISBN;
    ArrayList<Ksiazka> lista_ksiazka = new ArrayList<Ksiazka>();
    // Jeden tytul moze byc zwarty w wielu ksiazkach 
    
    public Tytuly(){}
    
    public ArrayList<Ksiazka> getLista()
    {
        return lista_ksiazka;
    }
    
    public int getRozmiarEK()
    {
        return lista_ksiazka.size();
    }
    
    public void setImie(String imie_)
    {
        imie = imie_;
    }
    public void setNazwisko(String nazwisko_)
    {
        nazwisko = nazwisko_;
    }
    public void setTytul(String tytul_)
    {
        tytul = tytul_;
    }
    public void setISBN(int ISBN_)
    {
        ISBN = ISBN_;
    }
    public String getImie()
    {
        return imie;
    }
    public String getNazwisko()
    {
        return nazwisko;
    }
    public String getTytul()
    {
        return tytul;
    }
    public int getISBN()
    {
        return ISBN;
    }    
    
    public boolean czyKsiazkaIstnieje(int numer)
    {
        Ksiazka nowa = new Ksiazka();
        nowa.setNumer(numer);
        if(!(lista_ksiazka.contains(nowa)))
            return true;
        
        return false;
    }
    
    public void dodajKsiazke(int numer)
    {
        Ksiazka nowa = new Ksiazka();
        nowa.setNumer(numer);
        if(czyKsiazkaIstnieje(numer))
            lista_ksiazka.add(nowa);
        nowa.setTytuly(this);
    }
    
    public void usunKsiazke(int numer)
    {
        Ksiazka nowa = new Ksiazka();
        nowa.setNumer(numer);
        int index = lista_ksiazka.indexOf(nowa);
        lista_ksiazka.remove(index);
    }
        
    public boolean equals(Object obj)
    {
        Tytuly obj1 = (Tytuly) obj;
        
        if(getISBN() == obj1.getISBN())
            return true;
        
        return false;
    }
    
    public String toString()
    {
        String zm = "";
        zm += "Imie: " + getImie() + " nazwisko : " + getNazwisko() + " tytul: " + getTytul() + " ISBN: " + getISBN();
        return zm;
    }

    
    public int compareTo(Tytuly obj) 
    {
        int zmienna = getNazwisko().compareTo(obj.getNazwisko());
                
        if(zmienna == 0)
            zmienna = getImie().compareTo(obj.getImie());
        
        
        return zmienna;
    }
}
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;


public class Uchwyt 
{
    ArrayList <Tytuly> lista_tytuly = new ArrayList<Tytuly>();
    Tytuly pom1;

                
    public Uchwyt() {}
    
    public Tytuly getTytuly()
    {
        return pom1;
    }
    
    public ArrayList<Tytuly> getLista()
    {
        return lista_tytuly;
    }
    
    public void setLista(ArrayList<Tytuly> obj)
    {
        lista_tytuly = obj;
    }
    
    public int getRozmiar()
    {
        return lista_tytuly.size();
    }
    
    public boolean czyTytulJuzIstnieje(String imie, String nazwisko , String tytul , int ISBN)
    {
        Tytuly nowy = new Tytuly();
        nowy.setImie(imie);
        nowy.setNazwisko(nazwisko);
        nowy.setTytul(tytul);
        nowy.setISBN(ISBN);
        if(!(lista_tytuly.contains(nowy)))
            return true;
        
        return false;
    }
    
    public void dodajTytul(String imie, String nazwisko , String tytul , int ISBN)
    {
        Tytuly nowy = new Tytuly();
        nowy.setImie(imie);
        nowy.setNazwisko(nazwisko);
        nowy.setTytul(tytul);
        nowy.setISBN(ISBN);
        
        if(czyTytulJuzIstnieje(imie,  nazwisko , tytul , ISBN))
            lista_tytuly.add(nowy);
    }
    
    public boolean czyIstniejeKsiazka(int numer)
    {
        if(pom1 != null)
        {
        if(pom1.czyKsiazkaIstnieje(numer))
            return true;
        }        
        return false;
    }
    
    public void dodajKsiazkee(int numer , int ISBN)
    {
        Tytuly nowa = new Tytuly();
        nowa.setISBN(ISBN);
        int index = lista_tytuly.indexOf(nowa);
        System.out.println(index);
        if(index != -1)
        {
            pom1 = lista_tytuly.get(index);
            pom1.dodajKsiazke(numer);
        }
        else 
            pom1 = null;
    }
    
    public void usunTytul(String zmienna, int kryterium)
    {
        if(kryterium == 1)
            usunTytulPoImieniu(zmienna);
        if(kryterium == 2)
            usunTytulPoNazwisku(zmienna);
        if(kryterium == 3)
            usunTytulPoTytule(zmienna);
        if(kryterium == 4)
            usunTytulPoISBN(zmienna);
    }
    
    public void usunTytulPoImieniu(String imie)
    {
        for(int i = 0 ; i < getRozmiar() ; i++)
        {
            if(lista_tytuly.get(i).getImie().equals(imie))
                lista_tytuly.remove(i);
        }
    }
    
    public void usunTytulPoNazwisku(String nazwisko)
    {
        for(int i = 0 ; i < getRozmiar() ; i++)
        {
            if(lista_tytuly.get(i).getNazwisko().equals(nazwisko))
                lista_tytuly.remove(i);
        }
    }
    
    public void usunTytulPoTytule(String tytul)
    {
        for(int i = 0 ; i < getRozmiar() ; i++)
        {
            if(lista_tytuly.get(i).getTytul().equals(tytul))
                lista_tytuly.remove(i);
        }
    }
    
    public void usunTytulPoISBN(String ISBN)
    {
        int zmienna = Integer.parseInt(ISBN);
        Tytuly nowa = new Tytuly();
        nowa.setISBN(zmienna);

        int index = lista_tytuly.indexOf(nowa);
        lista_tytuly.remove(index);
    }
    
    public void usunKsiazke(int zmienna)
    {
        pom1.usunKsiazke(zmienna);
    }
    
    public String wyszukajTytulZaPomocaTytulu(String tytul)
    {
        String s = "";
        for(int i = 0 ; i < getRozmiar() ; i++)
        {
            if(lista_tytuly.get(i).getTytul().equals(tytul))
                s += lista_tytuly.get(i).toString();
        }
        return s;
    }
    
    public String wyswietlTytuly()
    {
        String s = "";
        for(int i = 0; i < getRozmiar() ; i++)
        {
            s += "[ " + i + " ]    " + getLista().get(i).toString() + "\n";
        }
        return s;
    }
    
    public String wyswietlKsiazki()
    {
        String z = "";
        int zmienna = 0;
        for(int i = 0 ; i < getRozmiar() ; i++)
        {            
            for(int j = 0 ; j < getLista().get(i).getRozmiarEK() ; j++)
            {
                z += "[ " + zmienna++ + " ]    " + getLista().get(i).getLista().get(j).toString() + "\n";
            }
        }
        return z;
    }
    
    public String wyswietlenieKsiazkeDlaTytulu(String tytul)
    {    
        String s = "";
        for(int i = 0 ; i < getRozmiar() ; i++)
        {
            if(lista_tytuly.get(i).getTytul().equals(tytul))
            {
                for(int j = 0 ; j < getLista().get(i).getRozmiarEK() ; j++)
                {
                    s += getLista().get(i).getLista().get(j).toString() + "\n";
                }
            }
        }
        return s;
    }
    
    public void zapisDoPlikuTytulow() throws IOException
    {
        FileWriter plik = new FileWriter("plik.txt");
        PrintWriter zapis = new PrintWriter(plik);
        
        for(Tytuly zmienna : lista_tytuly)
        {
            zapis.print(zmienna + "\r\n");
        }
        zapis.close();
    }
    
    public void zapisDoPlikuKsiazke() throws IOException
    {
        FileWriter plik = new FileWriter("plik1.txt");
        PrintWriter zapis = new PrintWriter(plik);
        
        for(Tytuly zmienna : lista_tytuly)
        {
            for(Ksiazka zmienna1 : zmienna.getLista() )
                zapis.print(zmienna1 + "\r\n");
        }
        zapis.close();
    }
    
    public String odczytajZPlikuTytuly() throws IOException
    {
        String tekst = "";
        FileReader plik1 = new FileReader("plik.txt");
        BufferedReader odczyt = new BufferedReader(plik1);
        String odczytany_tekst = odczyt.readLine();
        
        while(odczytany_tekst != null)
        {
            tekst += odczytany_tekst + "\n";
            odczytany_tekst = odczyt.readLine();
        }
        odczyt.close();
        return tekst;
    }
    
    public String odczytajZPlikuKsiazki() throws IOException
    {
        String tekst = "";
        FileReader plik1 = new FileReader("plik1.txt");
        BufferedReader odczyt = new BufferedReader(plik1);
        String odczytany_tekst = odczyt.readLine();
        
        while(odczytany_tekst != null)
        {
            tekst += odczytany_tekst + "\n";
            odczytany_tekst = odczyt.readLine();
        }
        odczyt.close();
        return tekst;
    }
    
    public void sortuj(int kryterium)
    {
        if(kryterium == 1)
            Collections.sort(getLista());
//            for(Tytuly zmienna : lista_tytuly)
//                System.out.println(zmienna);
                
        if(kryterium == 2)
            Collections.sort(lista_tytuly , new SortujTytulPoTytul());
        
        if(kryterium == 3)
            Collections.sort(lista_tytuly, new SortujTytulPoISBN());
    }
}

Klasa Wypisz bez zmian.

1
String elo = uchwyt.wyswietlTytuly();
System.out.println(elo);
uchwyt.sortuj(1);
//elo = uchwyt.wyswietlTytuly();
System.out.println(elo);

Przypisujesz to do Stringa, sortujesz i wypisujesz jeszcze raz ten sam string. Odkomentuj to co ja dopisałem i sprawdź wtedy. Myślę, że to jest problemem.

0

Dzięki wielkie. :)

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