[Tablice]Tworzenie tablicy z pliku

0

Witam!

Przeszukałem już większość dostępnych źródeł, ale niestety bez zadowalających efektów. Mam następujący problem. Mam plik *txt mający 5000 rekordów jeden pod drugim w postaci double. Wygląda to tak:

767,762604061404
717,756150624601
187,854012096233
416,495764356337
666,862833158515
174,280482425485
973,264115850099
393,347536862524
916,45066110252
89,4943690344199
347,406183531231
595,430745089162
686,887385177839
...

Teraz muszę z zawartości tego pliku stworzyć tablicę, aby dalej móc na niej wykonywać operacje.
Udało mi się napisać coś takiego, ale niestety nie wiem co z tym zrobić dalej.

BufferedReader breader = new BufferedReader(new FileReader("dane.txt"));
		String line;
		double[] tab;
		while ((line = breader.readLine()) != null) {
			for(int i = 1; i < 5000; i++){
				double number = Double.valueOf(breader.readLine());	
			}
		}

Jeśli ktoś mógłby na to spojrzeć i jakoś pomóc to był bym wdzięczny :)

0

Z góry wiesz, że będzie dokładnie 5000 wierszy?

BufferedReader breader = new BufferedReader(new FileReader("dane.txt"));
                String line;
                double[] tab = new double[5000];
                while ((line = breader.readLine()) != null) {
                        for(int i = 0; i < 5000; i++) // miałeś błąd w tym wierszu
                       { 
                                double number = Double.valueOf(breader.readLine());
                                tab[i]=number;       
                        }
                }
0

Dziękuję bardzo za pomoc :)

Wiersze akurat dało się szybko policzyć i przyjąłem tą liczbę dla uproszczenia kodu. Przydało by się jednak, aby program jakoś sam zliczał liczbę rekordów ;)

W międzyczasie pojawiły się jeszcze drobne komplikacje:

  • Tablica jest indeksowana od zera, tak więc zamiast 5000 powinno być 4999
  • '767,762604061404' nie jest typem double tylko String. Zmiana przecinka na kropkę rozwiązuje ten problem, ale musiałem to robić ręcznie.
0

O czym Ty mówisz? Gdzie powinno być 4999 zamiast 5000?

0

Po co liczyc. Mozesz zastosowac jakas kolekcje i na koncu przekonwertowac na tablice.
Podczas tworzenia tablicy podajesz liczbe elementow: np new int[10] o znacza utworzenie tablicy z 10 elementami. Natomiast indeksowanie rozpoczyna sie od 0 wiec poszczegolne elementy maja indeksy 0,1,2,3,4,5,6,7,8,9 jak to policzysz wyjdzie ci rowne 10. Tak wiec w twoim kodzie new double[5000] jest poprawne.

Nie musiales zamieniac recznie przecinka na kropke. Mogles to zrobic za pomoca odpowiedniej funkcji i wywolywac ja po zczytaniu kazdej linijki z tekstu a nastepnie konwertowac to na typ double i zapisywac do tablicy.

0

Uzupełnię przedmówcę kodem wspomnianej funkcji, separatorem może być kropka, może byc przecinek.

    double getValue(String s)
    {
        double result=0.0;
        try
        {
            result=Double.parseDouble(s);
        }
        catch(NumberFormatException e)
        {
            try
            {
                s=s.replace(",",".");
                result=Double.parseDouble(s);
            }
            catch(NumberFormatException ex)
            {
            }
        }
        return result;
    }
0

Chodziło mi głównie o sposób tworzenia tablicy z danych umieszczonych w pliku. W przypadku pozostałych kolekcji zapewne wygląda to podobnie. Zamierzam później uzupełnić program w funkcje zliczające i zamieniające dane :)

for(int i = 0; i < 4999; i++)

W tym miejscu według mnie powinna być wartość 4999, ponieważ wpisanie 5000 powoduję wystąpienie wyjątku 'NullPointerException'.

0
BufferedReader breader = new BufferedReader(new FileReader("dane.txt"));
NumberFormat  numberFormat =  NumberFormat.getNumberInstance(new Locale("pl", "PL")); 

double[] tab = new double[5000];

for(int i = 0; i < tab.length; i++) {
   String line = breader.readLine();
   if (line == null){
       throw new Exception("Za malo danych");
   }
    tab[i] = (Double)numberFormat.parse(line);       
 }
0

Za pierwszym razem nie przyjrzałem się dokładnie Twojej pętli czytającej, ona ma usterkę - ignorujesz pierwszy przeczytany wiersz.

BufferedReader breader = new BufferedReader(new FileReader("dane.txt"));
                String line;
                double[] tab = new double[5000];
                while ((line = breader.readLine()) != null) {
                        for(int i = 0; i < 5000; i++)
                       {
                                double number = Double.valueOf(line);
                                tab[i]=number;       
                        }
                }
0
lukasz89x napisał(a)

Chodziło mi głównie o sposób tworzenia tablicy z danych umieszczonych w pliku. W przypadku pozostałych kolekcji zapewne wygląda to podobnie. Zamierzam później uzupełnić program w funkcje zliczające i zamieniające dane :)

for(int i = 0; i < 4999; i++)

> 
> W tym miejscu według mnie powinna być wartość 4999, ponieważ wpisanie 5000 powoduję wystąpienie wyjątku 'NullPointerException'.


NullPointerException to co innego niz ArrayIndexOfBoundException ktory wystepuje gdy odwolujesz sie do elementu z poza zakresu zadeklarowanej tablicy. Jesli uzyjesz i=0; i<4999 to tym samym opuscisz element 4999 w tablicy.

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