Wczytywanie z pliku.

0

Cześć,
napisałem metodę która wczytuje dane, na temat drużyn, zapisane w pliku .txt w formacie:
Nazwa
Liczba zwycięstw
Imię Zawodnika 1
Nazwisko Zawodnika 1
Imię Zawodnika 2
Nazwisko Zawodnika 2
pauza
Nazwa
Liczba zwycięstw
Imię Zawodnika 1
Nazwisko Zawodnika 1
Imię Zawodnika 2
Nazwisko Zawodnika 2
Imię Zawodnika 3
Nazwisko Zawodnika 3
pauza

Mój problem polega na tym, że drużyny mogą mieć różną liczbę zawodników. Dlatego dodałem "pauza", aby program wiedział, że jeśli pobierze takiego Stringa to ma przestać wczytywać dane zawodników i zacząć czytać dane kolejnej drużyny. Nie wiem gdzie jest błąd w moim kodzie.
Ps. Problemem jest także konwersja pobranej liczby zwycięstw, która jest Stringiem na typ int. Czy mogę to wykonać za pomocą Integer.valueOf()?

public void OdczytDruzyny(String nazwa) throws FileNotFoundException{           
        try (Scanner odczyt = new Scanner(new File(nazwa))) {
            while(odczyt.hasNext()){               
                Druzyna tmp=new Druzyna();
                Druzyny.add(tmp);
                tmp.setNazwa(odczyt.nextLine());
                tmp.setPunkty(Integer.valueOf((odczyt.nextLine())));
                while(!(odczyt.hasNext("pauza"))){
                    Zawodnik tmpz= new Zawodnik();
                    tmpz.setImie(odczyt.nextLine());
                    tmpz.setNazwisko(odczyt.nextLine());
                    tmp.dodajZawodnika(tmpz);
                }
            }
        }
    }

Konsola:
Exception in thread "main" java.lang.NumberFormatException: For input string: "Jagielonia"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at Klasy.Gra.OdczytDruzyny(Gra.java:118)
at projekt.Projekt.main(Projekt.java:19)

0
  1. Proponuję zamienić "pauza" na ";" dla czystej estetyki.
  2. Najpierw wczytaj cały plik tekstowy, a nie operuj na strumieniu
  3. Za pomocą metody split podzielisz łańcuch przez separator
    String[] drozyny = zawartoscPliku.split(";");
0

Z tego co widzę to próbujesz zmienić Stringa "Jagielonia" na liczbę więc nie dziwne, że rzuca Ci błąd. Więc w miejscu, w którym pobierasz następną wartość wpada Ci coś złego, w tym wypadku słowo Jagielonia zamiast jakiejś liczby zapisanej jako String. Najłatwiej będzie jak ustawisz sobie tam breakpointa i zobaczysz czy czegoś nie pomijasz, przeskakujesz itp. Samą metodę do zmiany String na int masz dobrą i możesz to wykonać za pomocą Integer.valueOf(). Różnica miedzy valueOf() a parseInt() jest taka, że valueOf zwraca Integer a parseInt() typ prosty int

Integer x = Integer.valueOf(str);
int y = Integer.parseInt(str);
0
Wesoły Samiec napisał(a):
  1. Proponuję zamienić "pauza" na ";" dla czystej estetyki.
  2. Najpierw wczytaj cały plik tekstowy, a nie operuj na strumieniu
  3. Za pomocą metody split podzielisz łańcuch przez separator
    String[] drozyny = zawartoscPliku.split(";");

Ale w takiej sytuacji jak będę mógł oddzielić nazwę drużyny od zwycięstw i danych zawodników? Bo do podziału danych poszczególnych drużyn użyję split(";"), a reszta?
Mam jeszcze pytanie, w jaki sposób działa metoda hasNext(). Po prostu sprawdza kolejnego Stringa i zwraca true/false, ale nie "przechodząc" w pliku do kolejnej linii?

1

Dla plain text i bez regexp:

  1. Proponuję trochę zmienić strukturę
    Grupa
    NAZWA_GRUPY;;ZWYCIESTWA;;UCZESTNIK 1;;UCZESTNIK N

    Dane

    GRUPA_1\nGRUPA_N
  2. Parsować przykładowo możesz tak:

    String separatorGrupy = "\n";
    String separatorElementow = ";;";
    String wejscie = "Grupa1;;1;;Uczestnik 1\nGrupa2;;11;;Uczestnik 1;;Uczestnik N";
    
    for(String grupa : wejscie.split(separatorGrupy))
        for(String element : grupa.split(separatorElementow)) {
    
            // Ciąg dlaszy parsowania
            System.out.println(element); 
        }
0

A tak w ogóle to może lepiej użyć Apache Commsons? W sumie jak się uczysz to warto moze wiedzieć jak działa obsługa plikow w Javie, ale mozna nie pisać też tyle boilerplate kodu :P

1
Wesoły Samiec napisał(a):
  1. Najpierw wczytaj cały plik tekstowy, a nie operuj na strumieniu
  2. Za pomocą metody split podzielisz łańcuch przez separator
    String[] drozyny = zawartoscPliku.split(";");

A jakby taki plik miał pół giga?

0

Dzięki wielkie za konkretne odpowiedzi. A zastosowanie apache commons w tak banalnym projekcie to chyba mija się z celem :D Chyba, że jest to szybkie, łatwe i przyjemne? :D

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