Java Podstawy - pytanie

Dyskusje na temat Javy.
witekmm
Początkujący
Początkujący
Posty: 5
Dołączył(a): piątek, 20 stycznia 2012, 19:59

Re: Java Podstawy - pytanie

Post przez witekmm »

Raczkuję w javie a mam pewne zagadnienie do rozwiązania i nie wiem jak to rozwiązać.
Chcę utworzyć strukturę dwuwymiarową o następującym układzie kolumn:
numer ewidencyjny (int), nazwisko (string), numer klucza1 (int), numer klucza2 (int)
Wg tej struktury chcę tworzyć listę. Czy mogę do tego użyć ArrayList ? Chciałbym by liczba wpisów nie była ograniczona,
poza tym po zakończeniu operacji gdy lista będzie zapełniona chciałbym zawartość dopisać do pliku tekstowego.
Oczywiście chciałbym również na żądanie czytać ww. zbiór tekstowy i zapełnić listę.
Czy mógłbym prosić o jakiś przykład lub przynajmniej sugestię jak to ugryźć?
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Java Podstawy - pytanie

Post przez Morfidon »

Mapping oznacza z ang. przyporządkowanie, najlepiej skorzystaj do tego z Map, które objaśniam dokładnie w niniejszym kursie:
http://videokurs.pl/kurs-java-aspekty-zaawansowane.php

Właściwie to można też zrobić ArrayList of ArrayList i w poszczególnych ArrayListach mieć poszczególne kolumny.
witekmm
Początkujący
Początkujący
Posty: 5
Dołączył(a): piątek, 20 stycznia 2012, 19:59

Re: Java Podstawy - pytanie

Post przez witekmm »

Raczej nie. Jeszcze mi nie leżą ArrayList czy LinkedList. Musze przespać temat.
To o co mi chodziło znalazłem w Lekcji 8 (Strumienie).
Jednak mam pewien problem z GregorianCallender.
Robię coś takiego (wydaje mi się, że tak samo jak w lekcji) :

GregorianCalendar kalendarz = new GregorianCalendar();
kalendarz.setTime(this.dataKolejnejGry); // deklaracja-> Date dataKolejnejGry;

Po wywołaniu pojawia mi się wyjątek: Exception in thread "main" java.lang.NullPointerException
Wskazywało by to, że nie tworzę obiektu, jednak nie wiem co może być źle.
Pewnie to jakiś szkolny błąd, lecz na chwilę obecną mam z tym problem.
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Java Podstawy - pytanie

Post przez Morfidon »

Podaj cały kod w znacznikach code, bo ciężko się domyślać po tej Twojej deklaracji co dokładnie źle zrobiłeś.
witekmm
Początkujący
Początkujący
Posty: 5
Dołączył(a): piątek, 20 stycznia 2012, 19:59

Re: Java Podstawy - pytanie

Post przez witekmm »

Postaram się.
Programik ten ma na celu zapis do pliku informacji czy gracz wygrał, przegrał czy poddał grę.
Po zapisie odczytuję zawartość (tak jak na lekcji).
Aktualizacja pliku następuje po każdej grze. Zapisywane są tylko takie informacje: Nazwa Gracza, Ilość gier, Ile wygrał, Ile przegrał, Ile poddał.
Początkowo chciałem zapisywać jeszcze datę ostatniej gry lecz w programie jest trochę innych bardziej istotnych błędów więc zrezygnowałem.
Wynik działania diametralnie odbiega od oczekiwań:
  • Po otwarciu pliku, zapis widnieje w jednej linii a nie tak jak jest zaprezentowane na lekcji w kilku wierszach
    błędnie wyliczana jest ilość rekordów. Wg programu jest 3 a nie 4.
    błędnie wylicza RAF.length() . Wg programu RAF.length() = 176 //Nie wiem skąd to bierze?.
Przerabiałem lekcję 8-smą (Strumienie) i wszystko było ok.
Teraz muszę robić jakiś błąd lecz nie wiem co. Jeżeli nie sprawi to zbytnio kłopotu to prosiłbym o pomoc.

Klasa Statystyka :

Code: Zaznacz cały

package statystyka;

import java.io.*;

public class Statystyka {

    public static void main(String[] args) {
        
        zapisGry[] zapG = new zapisGry[4];
        zapG[0] = new zapisGry("Witek", 1, 0, 1, 0);
        zapG[1] = new zapisGry("Jacek", 2, 1, 1, 0);
        zapG[2] = new zapisGry("Jorek", 3, 2, 1, 0);
        zapG[3] = new zapisGry("Piotr", 1, 1, 3, 0);
        try
        {        
            RandomAccessFile RAF = new RandomAccessFile("baza.txt", "rw");
            RAF.seek(0);
            zapisGry.zapiszDoPliku(zapG, RAF);
            
            RAF.seek(0);           
            
            zapisGry[] infOGrze = zapisGry.odczytajZPliku(RAF);
            for(int i=0; i<infOGrze.length; i++)
            {
                System.out.println(infOGrze[i].pobierzNazweGracza());
                System.out.println(infOGrze[i].pobierzLiczbeGier());
                System.out.println(infOGrze[i].pobierzLiczbeWygranychGier());
                System.out.println(infOGrze[i].pobierzLiczbePrzegranychGier());
                System.out.println(infOGrze[i].pobierzLiczbePoddanychGier());
                System.out.println("-----------------------");
            }            
            
            try
            {
            zapisGry b = new zapisGry();
            b.czytajRekord(RAF, 3);
            //System.out.println(b);
            b.czytajDane(RAF);
            
            //System.out.println("lala");
            }
            catch(BrakRekordu err)
            {
                System.out.println(err.getMessage());
            }
            RAF.close();
        }
        catch(IOException e)
        {
            System.out.println(e.getMessage());
        }
            
    }
}
Klasa zapisGry :

Code: Zaznacz cały

package statystyka;

import java.io.*;

public class zapisGry {

    public zapisGry()
    {
        this.nazwaGracza = " "; 
        this.liczbaGier = 0;
        this.wygral = 0;
        this.przegral = 0;
        this.poddal = 0;
    }
    
    public zapisGry(String nazwaGracza, int liczbaGier, int wygral, int przegral, int poddal)  //, int rokOd, int mmOd, int dzOd, int rokDo, int mmDo, int dzDo)
    {
        this();
        this.nazwaGracza = nazwaGracza; 
        this.liczbaGier = liczbaGier;
        this.wygral = wygral;
        this.przegral = przegral;
        this.poddal = poddal;
    }   

    public String pobierzNazweGracza()
    {
        return this.nazwaGracza;
    }    
    
    public int pobierzLiczbeGier()
    {
        return this.liczbaGier;
    }    
   
    public int pobierzLiczbeWygranychGier()
    {
        return this.wygral;
    }        
    
    public int pobierzLiczbePrzegranychGier()
    {
        return this.przegral;
    }        
    
    public int pobierzLiczbePoddanychGier()
    {
        return this.poddal;
    }            
    
    public static void zapiszDoPliku(zapisGry[] zapG, DataOutput outS) throws IOException
    {
        //System.out.println("zapG.length= "+zapG.length);
        for(int i=0; i<zapG.length; i++)
        {
            zapG[i].zapiszDane(outS);
        }
    }     
    
    
    public void zapiszDane(DataOutput outS) throws IOException
    {
        //StringBuffer stringB = new StringBuffer(zapisGry.DLUGOSC_NAZWY_GRACZA); 
        StringBuilder stringB = new StringBuilder(zapisGry.DLUGOSC_NAZWY_GRACZA);
        stringB.append(this.nazwaGracza);
        stringB.setLength(zapisGry.DLUGOSC_NAZWY_GRACZA);       
        outS.writeChars(stringB.toString());              // zapis nazwy gracza do pliku
              //System.out.println("W nazwaGracza"+stringB.toString());
        outS.write(this.liczbaGier);                      // zapis liczby gier w których uczestniczył gracz
              //System.out.println("W liczbaGier"+this.liczbaGier);
        outS.write(this.wygral);                          // zapis liczby wygranych gier
              //System.out.println("W wygral"+this.wygral);
        outS.write(this.przegral);                        // zapis liczby przegranych gier
             //System.out.println("W przegral"+this.przegral);
        outS.write(this.poddal);                          // zapis liczby poddanych gier
             //System.out.println("W poddal"+this.poddal);
    }

    public void czytajDane(DataInput inS) throws IOException
    {
        
        //StringBuffer tString = new StringBuffer(zapisGry.DLUGOSC_NAZWY_GRACZA);
        StringBuilder tString = new StringBuilder(zapisGry.DLUGOSC_NAZWY_GRACZA);
        
        for(int i=0; i<zapisGry.DLUGOSC_NAZWY_GRACZA; i++)
        {
            char tCh = inS.readChar();
            if (tCh != '\0')
                tString.append(tCh);
        }
        this.nazwaGracza = tString.toString();
        
        this.liczbaGier = inS.readInt();
        this.wygral = inS.readInt();
        this.przegral = inS.readInt();
        this.poddal = inS.readInt();

    }  // end-czytajDane    

    public static zapisGry[] odczytajZPliku(RandomAccessFile RAF) throws IOException
    {
        int ilRekordow = (int)(RAF.length()/zapisGry.DLUGOSC_REKORDU);
        // System.out.println("WM ilRekordow= "+ilRekordow);

        zapisGry[] zapG = new zapisGry[ilRekordow];
        
        for(int i=0; i<ilRekordow; i++)
        {
            zapG[i] = new zapisGry();
            zapG[i].czytajDane(RAF);
        }
        return zapG;
    }    
    
    public void czytajRekord(RandomAccessFile RAF, int n) throws IOException, BrakRekordu
    {
        System.out.println("czytajRekord/RAF.LENGTH= "+RAF.length());
        if(n<=RAF.length()/zapisGry.DLUGOSC_REKORDU)
        {
            RAF.seek((n-1)*zapisGry.DLUGOSC_REKORDU);
            this.czytajDane(RAF);
        }else
        {
            throw new BrakRekordu("Nie ma takiego rekordu!");
        }
    }
    
    public static final int DLUGOSC_NAZWY_GRACZA = 20;
    public static final int DLUGOSC_REKORDU = (Character.SIZE * DLUGOSC_NAZWY_GRACZA + 4*Integer.SIZE)/8;    
    private String nazwaGracza;   // identyfikator gracza
    private int liczbaGier;       // w ilu grach gracz uczestniczyl
    private int wygral;           // liczba wygranych gier
    private int przegral;         // liczba przegranych gier
    private int poddal;           // liczba poddanych gier
}

Klasa brakRekordu :

Code: Zaznacz cały

package statystyka;

public class BrakRekordu extends Exception
{
    public BrakRekordu()
    {
        super();
    }
    public BrakRekordu(String error)
    {
        super(error);
    }    

}

Wynik :

Code: Zaznacz cały

run:
Lenght= 3
DLUGOSC_NAZWY_GRACZA= 20
DLUGOSC_REKORDU= 56
Character.SIZE= 16
Integer.SIZE= 32
RAF.LENGTH 1= 176
Witek
16777472
4849761
6488165
7012352
-----------------------
ȁĀJore
7012352
0
0
0
-----------------------
̂ĀPiotr
0
0
0
0
-----------------------
czytajRekord/RAF.LENGTH= 176
null
BUILD SUCCESSFUL (total time: 0 seconds)
Zawartość pliku baza.txt :

Code: Zaznacz cały

 W i t e k                                 J a c e k                                J o r e k                                P i o t r                               
witekmm
Początkujący
Początkujący
Posty: 5
Dołączył(a): piątek, 20 stycznia 2012, 19:59

Re: Java Podstawy - pytanie

Post przez witekmm »

Przepraszam za zamieszanie. Już doszedłem co było powodem mojej frustracji.
W klasie zapisGry() użyłem metody

Code: Zaznacz cały

outS.write(this.*);
zamiast

Code: Zaznacz cały

outS.writeInt(this.*);
Teraz już wszystko biega. Szkolny błąd.
witekmm
Początkujący
Początkujący
Posty: 5
Dołączył(a): piątek, 20 stycznia 2012, 19:59

Re: Java Podstawy - pytanie

Post przez witekmm »

Witam.
W jaki sposób można tworzyć biblioteki klas w javie tak by były widoczne w innych pakietach i projektach. Chciałbym utworzyć bibliotekę klas i później móc ją wykorzystać w innych projektach lub udostępniać kolegom. Nie chciałbym transportować źródeł lecz same, przekompilowane klasy. Troszeczkę o tym była mowa w lekcji 12 "Pakiety i modyfikatory dostępu", lecz to dotyczyło wyłącznie klas w pakietach wewnątrz tego samego projektu. Nie było problemu z kompilacją kodu. Brakuje mi wiedzy na ten temat i tego tematu w programie kursów. Proszę o wyjaśnienie lub podanie jakichś źródeł by można było o tym sobie poczytać.
Z góry dziękuję i pozdrawiam.
Post Reply