logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Java: Sortowanie tablicy wg nazwisk i średniej w klasie Baza1

virgin71 10 Maj 2008 14:02 10433 10
REKLAMA
  • #1 5125927
    virgin71
    Poziom 10  
    Posty: 5
    Witam, czy ktoś może pomóc, bo kompletnie nie wychodzi mi nic:/ niestety z java.sun.com niewiele mogę zrozumieć. Ew. czy może ktoś pokazać podobny kod, bo na zasadzie analizy kodu bardzo szybko łapię.
    Potrzebuję sortowania wg. nazwisk i wg. średnie (ale wystarczy jedno, to sobie już dam radę).

    Zadanie:
    Napisz program, który tworzy klasę Baza1, która posiada metody: wypelnij_tablice();
    wyswietl_tablice();
    wyszukaj_w_tablicy();
    i powinien działać, jak program Baza.java. dołączony w postaci źródłowej do laboratorium, podany również dalej w postaci listingu. Klasa Baza1 posiada atrybuty: int N –rozmiar tablicy podawany z klawiatury, int ile=0-liczba danych w tablicy, na początku równa 0 oraz tablice elementów typu Osoba o nazwie Dane. W metodach, które należy zdefiniować,
    należy używać atrybutów klasy w sposób bezpośredni. Ciało tych metod należy zdefiniować wg wskazówek przy komentarzach do funkcji.

    Uzupełnij metody klasy Baza1 o metodę sortującą wg nazwiska: sortuj_tablicę_wg_nazwiska(). Należy
    wykorzystać metody do sortowania bąbelkowego z programu 2 z laboratorium3. Funkcja babelki teraz
    nazywa się sortuj_tablicę_wg_nazwiska(). Wywoływana w niej metoda porownaj_zamien ma teraz postać
               void  porownaj_zamien(int a, int b)          //  przekazanie indeksów tablicy 
                      { if (Dane[c].porownaj_nazwisko(Dane[a]))                                                             
                           zamien(a, c);  
                      }               } 

    W tym celu należy zdefiniować dodatkową metodę porownaj_nazwisko w klasie Osoba. Oznacza to że
    porównanie atrybutów klasy Osoba do sortowania powinna wykonywać metoda klasy Osoba, gdyż nazwisko
    jest jej atrybutem (zasada hermetyzacji)! Metoda ta powinna zwracać wynik true, gdy nazwisko w obiekcie
    Dane[c] powinno być alfabetycznie przez nazwiskiem w obiekcie Dane[a], a w przeciwnym razie false.
     public boolean porownaj_nazwisko (Osoba p) 
     { if ( nazwisko.compareTo(p.nazwisko)<0) //metoda compareTo w klasie String działa tak funkcja strcmp w C/C++ 
           return true; 
        else return false; }  

    3. Uzupełnij klasę Baza1 o metodę sortowanie_wg_sredniej, wg zasad podanych w punkcie 2.

    To co mam:
    import javax.swing.*;
    import java.util.*;
    
    class Osoba 
     { String nazwisko;
       float srednia;
       String uwagi;
       static int ile_obiektow = 0;
       
       public void Inicjuj()
        { ile_obiektow++;}
       public  void Nadaj_nazwisko(String lan)
        { nazwisko=lan;}
       public String Podaj_nazwisko()
        { return nazwisko;}
       public  void Nadaj_uwagi(String lan)
        { uwagi=lan;}
       public String Podaj_uwagi()
         { return uwagi;}
       public  void Nadaj_srednia(float srednia_)
        { srednia=srednia_;} 
      public float Podaj_srednia()
         {return srednia;}
     
      public void Wstaw()
      	 { String S;
      	   Inicjuj();
      	   S = JOptionPane.showInputDialog(null, "Podaj nazwisko"); 
      	   Nadaj_nazwisko(S);
      	   S = JOptionPane.showInputDialog(null, "Podaj srednia");
      	   Nadaj_srednia(Float.parseFloat(S));
      	   S =JOptionPane.showInputDialog(null, "Podaj uwagi");
      	   Nadaj_uwagi(S);
      	 }
    
    public void Wyswietl()
       {String napis="";
        napis+="\n Nazwisko: "+nazwisko;
        napis+="\n srednia: "+srednia;
        napis+="\n Uwagi: "+uwagi;
        napis+="\n Liczba osób jest równa "+ile_obiektow;
        JOptionPane.showMessageDialog(null, napis);
       }
       
      public boolean Szukaj(String s) 
       { return nazwisko.equals(s);
       }
     }  
    
     
    public class  Baza
    { static int N;  //zmienna typu static, która w programie przechowuje aktualny rozmiar tablicy 
      static public  void main(String args[])
     { Osoba Dane[]=null;   //referencja do tablicy, która jest tworzona w opcji 1
    int ile=0;                    
    String s;
     char ch;
     do
     { s=JOptionPane.showInputDialog(null, "Podaj wybor"
            +"\n1 - Wypelnij tablice,"
            +"\n2 - Wyswietl dane osob"
            +"\n3 - Wyszukaj osobe i wyswietl jej dane"
            +"\nk - Koniec programu");
        ch = s.charAt(0);  //pobranie opcji
        switch(ch)
       {case '1' : s=JOptionPane.showInputDialog(null,"Podaj rozmiar tablicy");
                       N=Integer.parseInt(s);
                       Dane=new Osoba[N]; //utworzenie tablicy
                        for (ile=0; ile<Dane.length;ile++)
                          { Dane[ile]=new Osoba(); //tworzenie elementów tablicy
                            Dane[ile].Wstaw();}
                       break;
         case '2' : if (Dane!=null)  //jesli tablica istnieje, to moóna wyswietlac
                           for (int i=0; i<ile;i++)
                              Dane[i].Wyswietl();  
                        break;
         case '3' : if (Dane==null) break; //jeóli tablica nie istnieje, nie moóna wyszukiwaó
                       s = JOptionPane.showInputDialog(null,"Podaj nazwisko");
                       for (int i=0; i<ile;i++)
                            {if (Dane[i].Szukaj(s))
                                   Dane[i].Wyswietl();
                            } 
                       break;        
         case 'k' : JOptionPane.showMessageDialog(null, "Koniec programu");
                       break;
         default : JOptionPane.showMessageDialog(null,"Zla opcja");       
        }
     }while (ch != 'k') ;
     System.exit(0);
    }}


    Kod proszę umieszczać w znacznikach code - krzychoocpp
  • REKLAMA
  • #3 5127904
    virgin71
    Poziom 10  
    Posty: 5
    Tak, ale nie umiem zastosować go do sortowania elementów tablicy na podstawie ich części (np. nazwiska)

    posortować cyferki w tablicy to umiem;)
  • REKLAMA
  • #4 5128035
    Dżyszla
    Poziom 42  
    Posty: 7065
    Pomógł: 1095
    Ocena: 211
    do porównywania wybierasz interesującą część
    do przestawiania stosujesz całe rekordy, czyli nieformalnym kodem:

    
    int Porównaj(string wart1, wart2: string);
    {
        return wart1<wart2;
    }
    
    void Zamien(&i1, &i2: Osoba)
    {
       string ts=i1.PodajNAzwisko();
       i1.NadajNazwisko(i2.PodajNAzwisko);
       i2.NAdajNazwisko(ts);
      float tsr=i1.PodajSrednia();
      i1.NadajSrednia(i2.PodajSrednia);
      i2.NadajSrednia(tsr);
      itd;
    }
    
    void Sortuj_po_Nazwiskach()
    {
       while(bąbelki)
       {
           if Porownaj(Dane[a].PodajNazwisko(),Dane[b].PodajNaziwsko())
                  Zamien(Dane[a],Dane[b]);
       }
    }
    

    PS. Nie pamiętam, jak się referencje pisało w Javie...
  • #5 5128165
    virgin71
    Poziom 10  
    Posty: 5
    Wstawiłem tak i niestety są same błędy - kompletnie nie rozumiem odnoszenia się do danych z poszczególnych rekordów w tablicy...
    
        public int porownaj_zamien(String a, String b)          
        {
            return a<b;  
        }
        void Zamien(String i1, String i2) 
        { 
            String ts=i1.PodajNazwisko(); 
            i1.NadajNazwisko=i2.PodajNazwisko; 
            i2.NadajNazwisko()=ts; 
            float tsr=i1.PodajSrednia(); 
            i1.NadajSrednia(i2.PodajSrednia); 
            i2.NadajSrednia(tsr); 
            String ts=i1.PodajUwagi(); 
            i1.NadajUwagi(i2.PodajUwagi);
            i2.NadajUwagi(ts);
        } 
    
  • Pomocny post
    #6 5128177
    Dżyszla
    Poziom 42  
    Posty: 7065
    Pomógł: 1095
    Ocena: 211
    w Zamien miałeś przekazać w parametrach referencje do obiektów, a nie stringi. Podandto funkcji (metodzie) nie możesz przypisywać wartości - metody się wywołuje.
  • #7 5132829
    virgin71
    Poziom 10  
    Posty: 5
    Mógłbyś napisać kawałek gotowego kodu, bo mi te referencje nie idą:/ ciągle jest błąd.
  • REKLAMA
  • #8 5155126
    virgin71
    Poziom 10  
    Posty: 5
    mam kod, udał mi się w końcu, może komuś się przyda:
    
    package baza;
    import javax.swing.*;
    
    class Osoba
    {
        String nazwisko="";
        float srednia=0;
        String uwagi="";
        static int ile_obiektow = 0;
        static char odp;
    
        public void Nadaj_nazwisko(String lan)        
        {
            nazwisko=lan;
        }
        public String Podaj_nazwisko()
        {
            return nazwisko;
        }
        public void Nadaj_uwagi(String lan)
        {
            uwagi=lan;
        }
        public String Podaj_uwagi()
        {
            return uwagi;
        }
        public void Nadaj_srednia(float srednia_)
        {
            srednia=srednia_;
        }
        public float Podaj_srednia()
        {
           return srednia;
        }
        public boolean porownaj_nazwisko(Osoba typ)
        {
            return (nazwisko.compareTo(typ.nazwisko) < 0) ? true : false;
        }
        public boolean porownaj_srednia(Osoba typ)
        {
            return (srednia < typ.srednia) ? true : false;
        }
        public boolean Szukaj(String s)
        {
            return nazwisko.equals(s);
        }
        public void Wstaw()
        {
           String S;
           S = JOptionPane.showInputDialog(null, "Podaj nazwisko");
           Nadaj_nazwisko(S);
           S = JOptionPane.showInputDialog(null, "Podaj srednia");
           Nadaj_srednia(Float.parseFloat(S));
           S =JOptionPane.showInputDialog(null, "Podaj uwagi");
           Nadaj_uwagi(S);
        }
        public void Wyswietl(int ile_obiektow)
        {
            String napis="";
            napis+="\n Nazwisko: " + nazwisko;
            napis+="\n Srednia: " + srednia;
            napis+="\n Uwagi: " + uwagi;
            napis+="\n Liczba osob jest rowna " + ile_obiektow;
            JOptionPane.showMessageDialog(null, napis);
        }
    }
    
    public class baza
    { 
       public int N=0, licz=0;
       protected int ile=0;
       private Osoba Dane[]=null;
       private Osoba Pomoc[]=null;
       
       public void wypelnij_tablice()
       {
           if(Dane == null)
           {
           String s = JOptionPane.showInputDialog(null,"Podaj rozmiar tablicy");
           N = Integer.parseInt(s);
           Dane = new Osoba[N];
           }
           for(ile = 0; ile < Dane.length; ile++)
           {
               Dane[ile] = new Osoba();
               Dane[ile].Wstaw();
           }
       }
       
       public void wstaw_osobe()
       {
           if(Dane == null)
           {
               JOptionPane.showMessageDialog(null, "Tablica nie istnieje, zostanie utworzona...");
               wypelnij_tablice();
           }
           if(ile < Dane.length)
           {
               Osoba os = new Osoba();
               os.Wstaw();
               Dane[ile] = os;
               ++ile;
           }
           else 
           {
               Pomoc = new Osoba [N];
               Pomoc = Dane;
               Dane = new Osoba[N+1];
               for(int i = 0; i < ile; i++)
               {
                   Dane[i]=Pomoc[i];
               }
               N++;
           }
       }
       public void wyswietl_tablice()
       {
            if (Dane != null)
            for(int i = 0; i < ile; i++)
                Dane[i].Wyswietl(ile);
            else
            JOptionPane.showMessageDialog(null, "Tablica nie istnieje");
       }
       public void wyszukaj_w_tablicy()
       {
            if (Dane==null)
            return;
            String s = JOptionPane.showInputDialog(null, "Podaj nazwisko");
            licz=0;
            for(int i = 0; i < ile; i++)
            {
                if(Dane[i].Szukaj(s))
                {
                    Dane[i].Wyswietl(ile);
                    licz=1;
                }
            }
            switch(licz)
            {
                case 0: JOptionPane.showMessageDialog(null, "Brak nazwiska w bazie");
                break;
            }
       }
       public void sortujN()
       {
           for(int j = 0; j < ile - 1; j++)
            for(int i = 0; i < ile - 1; i++)
                porownajN(i, i + 1);
           JOptionPane.showMessageDialog(null, "Sortowanie zakonczone");
       }
       public void  sortowanieS()
       {
           for (int j = 0; j < ile - 1; j++)
            for (int i = 0; i < ile - 1; i++)
                porownajS(i, i + 1);
           JOptionPane.showMessageDialog(null, "Sortowanie zakonczone");
       }
       private void porownajN(int a, int b)
       {
           if(Dane[b].porownaj_nazwisko(Dane[a]))
           {
               zamien(a,b);
           }
       }
       private void porownajS(int a, int b)
       {
           if(Dane[b].porownaj_srednia(Dane[a]))
           {
               zamien(a,b);
           }
       }
       public void usun()
       {
           if(Dane == null)
           {
               JOptionPane.showMessageDialog(null, "Tablica nie istnieje");
               return;     
           }
           if(ile == 0)
           {
               JOptionPane.showMessageDialog(null, "Usunieto wszystkie wpisy");
               return;     
           }
           String s = JOptionPane.showInputDialog(null, "Podaj nazwisko");
           for(int i = 0; i < ile; i++)
           {
               if(Dane[i].Szukaj(s))
               {
                   int k = 0;
                   for(int j = 1; j < ile - i; j++, k++)
                   {
                       Dane[i + k] = Dane[i + j];
                   
                       --ile;
                   }
               }
    
           }
       }
       private void zamien(int a, int b)
       {
           Osoba tmp = Dane[a];
           Dane[a] = Dane[b];
           Dane[b] = tmp;
       }   
       static public void main(String args[])
       {
          String s,t;
          char ch,odp;
          baza baza = new baza();
          Osoba Dane[]=null;
          do {
                s=JOptionPane.showInputDialog(null, "Podaj wybor"
                +"\n1 - Wypelnij tablice"
                +"\n2 - Wyswietl dane osob"
                +"\n3 - Wyszukaj osobe i wyswietl jej dane"
                +"\n4 - Sortowanie wg. sredniej"
                +"\n5 - Sortowanie wg. nazwiska"
                +"\n6 - Usun osobe"
                +"\n7 - Wstaw osobe"
                +"\nk - Koniec programu");
                ch = s.charAt(0);
                switch(ch)
                {
                    case '1': baza.wypelnij_tablice(); break;
                    case '2': baza.wyswietl_tablice(); break;
                    case '3': baza.wyszukaj_w_tablicy(); break;
                    case '4': baza.sortowanieS(); break;
                    case '5': baza.sortujN(); break;
                    case '6': baza.usun(); break;
                    case '7': baza.wstaw_osobe(); break;       
                    case 'k': JOptionPane.showMessageDialog(null, "Koniec programu");
                    break;
                    default: JOptionPane.showMessageDialog(null,"Zla opcja");
                 }
           } while(ch != 'k');
         System.exit(0);
      }
    }
    


    Zobaczymy jeszcze jaką ocenę dostanę:)

    P.S. Najgorsze okazało się dodawanie nowej osoby do istniejącej listy (pewnie dlatego był to podpunkt z gwiazdką;) ) - niestety mam 2 tyg spóźnienia:/
  • #9 5155288
    Dżyszla
    Poziom 42  
    Posty: 7065
    Pomógł: 1095
    Ocena: 211
    Bo generalnie takich rzeczy nie robi się nie tablicach... No i to usuwanie niestety nie zwolni pamięci zarezerwowanej wcześniej...

    Swoją drogą to Java (a w zasadzie odśmiecacz, czy jak to się tam zwie, garabage colecor?) uczy złych nawyków :/ Ale to nie istotne.
  • #10 5155692
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    Dżyszla napisał:

    to usuwanie niestety nie zwolni pamięci zarezerwowanej wcześniej...

    Obiekty w JAvie sa usuwane jesli zadna referencja na niego nie wskazuje czyli wystarczy danej referencji przypisac NULL i obiekt bedzie zwolniony (pod warunkiem ze inne referencje na niego nie wskazuja).

    W Javie wszystko jest referencja wiec nie trzeba stawiac przed nia znaku & tak jak w C++.

    No i w koncu sortowanie mozna zrobic z uzyciem dobrodziejstw Javy np:

    
    import java.util.*;
    import java.io.*;
    
    public class TestSort1 {
    
    String [] words = { "Réal", "Real", "Raoul", "Rico" };
    
    public static void main(String args[]) {
        new TestSort1().doit();
    }
    
    public void doit() {
        try {
          // to be able output french character at the console
          Writer w =
          new BufferedWriter
           (new OutputStreamWriter(System.out, "Cp850"));
          //
          w.write("Before :\n");
          for(int i=0; i < 4 ; i++) {
            w.write(words[i] + " ");
            }
    
          java.util.Arrays.sort(words);
    
          w.write("\nAfter :\n");
          for(int i=0; i < 4 ; i++) {
            w.write(words[i] + " ");
            }
          w.write("\n");
          w.flush();
          w.close();
          }
        catch(Exception e){}
        }
    }
    
  • REKLAMA
  • #11 5155930
    Dżyszla
    Poziom 42  
    Posty: 7065
    Pomógł: 1095
    Ocena: 211
    fantom - i właśnie w tym rzecz, że przy usuwaniu zrealizowanym tak, jak to pokazał virgin, nie nastąpi zwolnienie pamięci :) leiej byłoby się podobnym sposobem, jak rozszerzanie zawęzić tablicę.

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji sortowania tablicy obiektów klasy Osoba w języku Java, według nazwisk lub średniej ocen, w ramach klasy Baza1. Poruszono problem zastosowania algorytmu sortowania bąbelkowego do obiektów, gdzie porównania powinny dotyczyć wybranych pól (np. nazwiska), a zamiana obejmuje całe obiekty. Wskazano błędy w próbach przekazywania parametrów jako Stringów zamiast referencji do obiektów oraz niepoprawne przypisywanie wartości metodom. Zaproponowano poprawne podejście z przekazywaniem referencji do obiektów Osoba i wywoływaniem metod get/set. Przykładowy kod klasy Osoba zawiera metody do pobierania i ustawiania nazwiska, średniej i uwag oraz metodę porównującą nazwiska. W dyskusji pojawiła się także uwaga o zarządzaniu pamięcią w Javie i różnicach w stosunku do C++, a także sugestia wykorzystania wbudowanych mechanizmów sortowania Javy (np. Collections.sort) dla lepszej efektywności i czytelności kodu.
Wygenerowane przez model językowy.
REKLAMA