Java wczytywanie danych z pliku txt do tabeli

0

Witam
mam pytanie odnośnie wczytywania danych do tabeli.
Mam dane w formacie
64
65
54
67
...
i tak 20000 linijek.
Są to dane potrzebne do klasyfikacji pomiarów.
Jak najprościej wczytać te dane z pliku txt do tabeli w java? Następnie muszę policzyć odległości między dowolnymi dwiema wartościami z tych danych, ale to już kolejny krok.
Z góry dziękuję za pomoc.

1

Wczytujesz linia po linii (BufferedReader) i każdą z nich interpretujesz jako Integer (Integer.parseInt()). Wstawiasz wszytko to listy/tablicy i po problemie. Albo używasz klasy Scanner.

0

Nie jestem informatykiem (jestem matematyczką), więc pewnie moje pytania są dość podstawowe, ale w jaki sposób deklaruję, żeby każdą linijkę umieszczał w osobnej komórce tabeli?
Pozdrawiam
M

0

Masz tu gotowy kod, umiesc go w pliku o nazwie ListaLiczb.java

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

public class ListaLiczb {

	private List<Integer> liczby = new ArrayList<Integer>();
	
	public void dodajLiczbe(int liczba) {
		liczby.add(liczba);
	}
	
	public int wezLiczbe(int indeks) {
		return liczby.get(indeks);
	}
	
	public int ileLiczb() {
		return liczby.size();
	}
	
	public static void main(String[] args) {
		ListaLiczb w = new ListaLiczb();
		
		String nazwaPliku = "liczby.txt";
		
		try {
			BufferedReader br = new BufferedReader(new FileReader(nazwaPliku));
			String linia = null;
			while ((linia = br.readLine()) != null) {
				int liczba = Integer.parseInt(linia.trim());
				w.dodajLiczbe(liczba);
			}
		} catch (Exception e) {
			System.err.println("Wystapil blad przy wczytywaniu danych");
			e.printStackTrace();
		}
		System.out.println("Wczytanych liczb: " + w.ileLiczb());
	}

}
0

dziękuję serdecznie i pozdrawiam

0

Kod uwzględniający informowanie o błędnych liniach w pliku (i ignorujący je przy wczytywaniu):

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ListaLiczb {

	private List<Integer> liczby = new ArrayList<Integer>();
	
	public void dodajLiczbe(int liczba) {
		liczby.add(liczba);
	}
	
	public int wezLiczbe(int indeks) {
		return liczby.get(indeks);
	}
	
	public int ileLiczb() {
		return liczby.size();
	}
	
	public static void main(String[] args) {
		ListaLiczb w = new ListaLiczb();
		
		String nazwaPliku = "liczby.txt";
		
		List<String> bledneLinie = new ArrayList<String>();
		try {
			BufferedReader br = new BufferedReader(new FileReader(nazwaPliku));
			String linia = null;
			int nrLinii = 1;
			while ((linia = br.readLine()) != null) {
				try {
					int liczba = Integer.parseInt(linia.trim());
					w.dodajLiczbe(liczba);
				} catch (NumberFormatException e) {
					bledneLinie.add("Linia: " + nrLinii + ", wartosc=\"" + linia + "\"");
				}
				nrLinii++;
			}
		} catch (IOException e) {
			System.err.println("Wystapil blad przy wczytywaniu danych");
			e.printStackTrace();
		}
		System.out.println("Wczytanych linii: " + w.ileLiczb() + ", w tym blednych: " + bledneLinie.size());
		if (bledneLinie.size() > 0) {
			System.out.println("Wystapily bledne linie w pliku:");
			for (String l : bledneLinie) {
				System.out.println(l);
			}
		}
		
	}

}
0

Moje problemy są niemożliwe :)
Chciałam wyświetlić tę listę, ale robię to komendą
System.out.println(Array.toString(liczby)); i wyskakuje błąd.
Jaka jest na to rada?

0

"liczby" to nie jest tablica... dlatego Ci się nie udało :p

for (int i = 0; i < liczby.ileLiczb(); i++) {
  System.out.println("Liczba pod indeksem: " + i + " to " + liczby.wezLiczbe(i));
}
0

Nie rozumiem po co wyświetlać kolekcję 20 tys. liczb. Ale jeśli jest to uzasadnione, to można tak:

System.out.println(liczby);
0

Przyjazna klasa do wczytywania tokenów ze strumienia - StreamTokenizer.

0

Mam kolejne pytanie. Poniżej umieszczam kod-wczytuję dane z pliku txt do ArrayList, ale potrzebuję tablicy. Tak jak to napisałam nie działa. Może jakaś podpowiedź? Najlepiej by było, gdyby kopiowało mi to od razu do pierwszej kolumny tablicy 2-wymiarowej. Kolejnym krokiem będzie obliczenie odległości pomiędzy wartościami z tej tabeli a dokładnie posegregowanie ich i wyznaczenie dla każdego punktu odległości od k najbliższych sąsiadów dla ustalonego k (np k=51). Może podpowiecie jak to najszybciej zrobić?

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
public class  LOFactor {
 
        /**
     *
     */
    public List<Double> liczby = new ArrayList<>();
    
        private double distance;
 
        
        /**
     *
     * @param liczba
     */
    public void dodajLiczbe(double liczba) {
                liczby.add(liczba);
        }
 
        public Double wezLiczbe(int indeks) {
                return liczby.get(indeks);
        }
 
        public int ileLiczb() {
                return liczby.size();
        }
 
        public static void main(String[] args) {
                LOFactor w = new LOFactor();
 
                String HR1 = "C:/Users/Maja/Desktop/dyplom/instancje/HR1.txt";
 
                List<Double> lista = new ArrayList<>();
                // wypelnianie listy
                double[] tablica = new double[lista.size()];
                    for (int i = 0; i < lista.size(); i++) {
                    tablica[i] = lista.get(i);
                    }
                List<String> bledneLinie = new ArrayList<>();
                
                try {
                        BufferedReader br = new BufferedReader(new FileReader(HR1));
                        String linia = null;
                        int nrLinii = 1;
                        while ((linia = br.readLine()) != null) {
                                try {
                                        int liczba = Integer.parseInt(linia.trim());
                                        w.dodajLiczbe(liczba);
                                } catch (NumberFormatException e) {
                                        bledneLinie.add("Linia: " + nrLinii + ", wartosc=\"" + linia + "\"");
                                }
                                nrLinii++;
                        }
                } catch (IOException e) {
                        System.err.println("Wystapil blad przy wczytywaniu danych");
                }
                
                System.out.println("Wczytanych linii: " + w.ileLiczb() + ", w tym blednych: " + bledneLinie.size());
                if (bledneLinie.size() > 0) {
                        System.out.println("Wystapily bledne linie w pliku:");
                        for (String l : bledneLinie) {
                                System.out.println(l);
     
                        }
                }
                Double[] tablica = lista.toArray(new Double[]{});
                System.out.println(tablica[3]);
        }
}
0

Jak już będę miała tabelę odległości (która ma być w programie wyliczona raz na początku w fazie treningowej), to będę chciała wyliczyć odległości pomiędzy nowym pomiarem,a wartościami treningowymi. Napisałam to tak:
double[][] DistTable = new double [2][instancje.length];
for(int i=1: i<instancje.length; i++){
DistTable[0][i] = instancje[i];
for(int n = 0; n<instancje.length; n++){
distance = NewValue - instancje[n]>0 ? NewValue - instancje[n] : - NewValue + instancje[n];
DistTable[1][n] = distance;
}
ale to niespecjalnie działa. Może jakaś rada?

0

Wiem, że rzeczy, o które pytam, to podstawy. Nie jestem programistką i zapewne nigdy nie będę. Jestem matematyczką, ale staram się nauczyć javy. :) Dlatego wszystkim, którzy mi pomagają, dziękuję za pomoc.

0

Nie możesz po prostu przepisać?

int[][] tab = new int[liczby.size()][2];
for(int i=0;i<liczby.size();i++)
{
    tab[i][0] = liczby.get(i); 
}

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