Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
. Chciałabym teraz wczytać sobie Imię,Nazwisko każdego studenta z pliku i wstawić do odpowiedniego obiektu Student w ArrayList. Jak prawidłowo obiektowo powinnam to zrobić? Stworzyć klasę np. ReadFile i tam metody np. getLineCounter(); getImie(int id); getNazwisko(int id); ? I potem w main() pętlę typu for(i=0;i<readFile.getLineCounter();i++)
Kopiuj
i po kolei jechać sobie ustawiać? Czy to jest prawidłowe podejście? Tylko wtedy będę musiała w klasie ReadFile utworzyć oddzielne ArrayList<String> na przechowywanie Nazwisk, oddzielne na Imiona tak? Trochę wydajnościowo to kiepsko wygląda chyba :?
Pozdrawiam
Później wystarczy wywołać java Prog < studenci.txt zakładając, że plik jest poprawny. Można też zmienić wczytywanie tj. zamienić System.in na np. new File("studenci.txt").
@karolinaa to zależy jak te dane przechowujesz. No jeśli to coś na wzór "jedna linia - jeden obiekt" to możesz zrobić konstruktor Student który potrafi zrobić studenta na podstawie takiej linii. Jeśli wymaga ona jakichś cudów na kiju, regexpów etc to mozesz zrobić też jakiegoś helpera który w tej konstrukcji będzie pomagał.
@Shalom helper... czyli? hmm... jeszcze mam problemy z tą obiektowością mianowicie: co w przypadku jeśli w przyszłości zmienię sobie format pliku? Załóżmy w pierwszej linijce dodam informację o grupie tych studentów, np plik:
Nie chciałabym wtedy rozgrzebywać całego programu.
Czy taka klasa to jest dobry pomysł? zwłaszcza te ArrayList w tej klasie mnie martwią ;/?
Kopiuj
importjava.io.IOException;importjava.nio.charset.Charset;importjava.nio.charset.StandardCharsets;importjava.nio.file.Path;importjava.nio.file.Paths;importjava.util.ArrayList;importjava.util.Scanner;importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassFileParse{privatefinalstaticCharsetENCODING=StandardCharsets.UTF_8;privatefinalPathFilePath;privateArrayList<String> names =newArrayList<String>();privateArrayList<String> surnames =newArrayList<String>();privateint recordsCounter =0;publicFileParse(StringFilePath){this.FilePath=Paths.get(FilePath);}publicStringgetName(int id){return names.get(id);}publicStringgetSurname(int id){return surnames.get(id);}publicintgetRecordCounter(){return recordsCounter;}publicfinalvoidparse()throwsIOException{try{Scanner scanner =newScanner(FilePath,ENCODING.name());//w pierwszej linijce pojawiła się informacja o grupie, więc dodajęprocessGroupInfo(scanner.nextLine());while(scanner.hasNextLine()){processRecord(scanner.nextLine());}}catch(IOException ex){System.out.println("do ogarnięcia");}}protectedvoidprocessRecord(StringLine){Pattern recordPattern =Pattern.compile("\\[(.*)==(.*)\\]");Matcher recordMatcher = recordPattern.matcher(Line);if(!recordMatcher.find())return;
names.add(recordsCounter, recordMatcher.group(1));
surnames.add(recordsCounter, recordMatcher.group(2));
recordsCounter++;}/* format pliku zmienił się w pierwszej linii dodam informację
odnośnie nazwy grupy tych studentów np. [M101] dodaję, więc:
*/privateString groupInfo;publicStringgetGroupInfo(){return groupInfo;}protectedvoidprocessGroupInfo(StringLine){Pattern groupPattern =Pattern.compile("\\[(.*)\\]");Matcher groupMatcher = groupPattern.matcher(Line);if(!groupMatcher.find())return;
groupInfo = groupMatcher.group(1);}}
potem przy parsowaniu używam np tylko:
Kopiuj
FileParse test =newFileParse("test.txt");
test.parse();System.out.println(test.getGroupInfo());for(i=0;i<test.getRecordCounter();i++)
records.add(i,newStudent(test.getSurname(i),test.getName(i)));
PS
proszę nie zwracać uwagi na głupie nazwy zmiennych czy brak obsługi wyjątków jestem początkująca i chodzi tylko oto jak podejść do takiego zagadnienia prawidłowo.
a i obiekt Student do którego wczytuje Imię i Nazwisko z pliku ma jeszcze inne pola, np. Numer Indeksu - ale to pobieram już z innego miejsca.
Shalom
Srsly, ludzie z warsaw shore? Miałem o Tobie lepsze zdanie :P
karolinaa
o jej to fajny rozrywkowy program. oglądam dla beki. niedziela 23:00 - obowiązkowo mtv :)
Moim zdaniem takie rozwiązanie jest mega słabe. To już lepiej by było gdyby ten twój parser potrafił jednak sam tworzyć tych studentów, bo w zasadzie to jest taki "transformer" który przetwarza jedną reprezentację obiektów (tekstową w pliku) na inną.
Usunąć wpis?
Tej operacji nie będzie można cofnąć.
niezalogowany
niezalogowany
0
Najlepiej w tym celu skorzystać z normalnej bazy danych albo mechamizmu serializacji (ObjectInputStream i ObjectOutputStream). Ewentualnie bibliotekę Kryo, która ponoć ma znacznie wyższą wydajność.
@Shalom a mogłabym od razu w tym "parserze" tworzyć ArrayList obiektów klasy Student? i potem zwrócić po prostu tak żebym mogła na tym operować w main()?
@niezalogowany - na razie to chciałam nauczyć się podstaw :)
Moim zdaniem, lepiej zrobić osobną klasę, która zawiera dane o studencie, tak jak w moim poprzednim poście. Ta klasa powinna być niezależna od rodzaju wczytywania, bo mogą być różne metody (z pliku, z bazy danych). Helper w tym przypadku jest pomocny i oznacza, aby zrobić dodatkową klasę która wczytuje dane z pliku i zwraca listę studentów. Gdy później będziesz potrzebowała obsłużyć inny format pliku, wystarczy napisać kolejny helper.
heh ,dobra mam jeszcze dwa pytania (dopiero teraz mam znowu czas na Javę);
Mój projekt składa się z kilku osobnych plików (*.java). W osobnym pliku mam klasę Student, Czy klasę "StudentsFileHelper" tak samo mogę umieścić w osobnym pliku i zrobić ją public?
Czy do "parsowania" z pliku informacji na temat tego pliku (1 wiersz np. Autor, Data spisu), powinnam stworzyć osobną klasę? Np. InfoFileHelper?
Przejrzałam przed chwilą sobie pobieżnie Single Responsibility Principle, Low Coupling stąd http://www.e-point.pl/_fileserver/item/1500355 i chcę się po prostu upewnić czy prawidłowo obiektowo do tego podchodzę. tak żeby sprzyjało to przyszłej skalowalności aplikacji.
Pozdrawiam i dzieki
Usunąć wpis?
Tej operacji nie będzie można cofnąć.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.
Shalomkarolinaa