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.
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.
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
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());
}
}
dziękuję serdecznie i pozdrawiam
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);
}
}
}
}
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?
"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));
}
Nie rozumiem po co wyświetlać kolekcję 20 tys. liczb. Ale jeśli jest to uzasadnione, to można tak:
System.out.println(liczby);
Przyjazna klasa do wczytywania tokenów ze strumienia - StreamTokenizer.
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]);
}
}
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?
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.
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);
}