Odczyt pliku roznych danych do np. tablicy

0

Witam wszysktki bardzo serdecznie!
Chodzi mi o odczyt pliku, w ktory znajduja sie dane roznego rodzaju i wymiaru.

Struktora pliku (dane.dat) wyglada nastepujaco:

Linie : x0 y0 x1 y1
Rectangle : x0 y0 x1 y1 x2 y2 x3 y3 x4 y4
Ellipse :x0 y0 x1 y1 x2 y2

czyli:

L0 21 32
L1 32 34

R0 32 43 45 32 12 45 43 32
R1 32 12 45 43 32 32 43 76

E0 12 54 45 67 22 32

Teraz chce wczytac np. L0 i wpisac do tablicy, a potem R0 i E0 i takze w roznych tablicach zapisac.
Tak, ze otrzymam trzy tablice o roznych rozmiarach. Jak to zrobic?

Wiem jak wczytac, ale nie wiem jak moza warunek ustawic, zeby mi w pliku tylko L0 i np. R0 zajdywal i zapisywal w tablicy.
Np.
Tablica R0: 23 23 54 66 78 23 45 43

Za wszelaka pomoc z gory dziekuje.

0

Piszesz sobie reader - klasę narzędziową, która czyta plik linia po linii. Sprawdzasz pierwszy wpis linii (linia wczytana jako String, i potem split po spacjach - masz tablicę obiektów) i jeżeli jest to coś czego szukasz to dodajesz do jakiejś pomocniczej listy. Gdy skończysz czytać plik zwracasz listę.

0

Mam juz cos takiego, ale nie wiem jak to sprawdzic czy to jest juz cos nowego jakis if moze albo cos? Tu taj zamieniam wszystko na integer i stringów jak np. L0 nie moge wczytać.

import java.io.*;

public class odczyt {

public static void main (String args[]){
	 
	//int n = 0;
	int[][] board1 = new int[][]{{0,0},{0,0}};
	int[] board = new int []{0,0};

try
{
String s;
int i,j=0;

	FileReader fr = new FileReader("dane.dat");
	BufferedReader br = new BufferedReader(fr);
	
	while((s = br.readLine()) != null)
	{
		String[] b;
		int k=j++;
		//System.out.println(k);
		//System.out.println(s);
		b = s.split(" ");
		for(i=0;i<b.length;i++){
			//System.out.println(b[i]);
			board[i]=Integer.parseInt(b[i]);						
			}
		//System.out.println(board[0]+" "+board[1]);			
			for(int z=0;z<2;z++){
				board1[k][z]=board[z];
		
		}
	}
	
	fr.close();
	

} catch (IOException e){
System.out.println("Error!"+e);
}

System.out.println("Score: \n"+board1[0][0]+" "+board1[0][1]+" "+board1[1][0]+" "+board1[1][1]);
}
}

0

możesz też stworzyć klasy Linie, Rectangle, Ellipse.
Wczytując sprawdzać czy regex pasuje do patternu

  1. Line -> "^[A-Z0-9]+ ([0-9]{1} ){4}$" -> group 1-4 to kolejne wartości
  2. Rectangle -> "^[A-Z0-9]+ ([0-9]{1} ){10}$" -> group 1-10 kolejne wartości
  3. Ellipse -> "^[A-Z0-9]+ ([0-9]{1} ){6}$" -> group 1-6 kolejne wartości

tworzyć odpowiedni obiekt i dodawać do listy

0

To sprawdź jeszcze czy tablica nie jest pusta.

0

Siemka.
Tablica nie jest pusta patrz.

import java.io.*;

public class odczyt {

public static void main (String args[]){
	 

try
{

String s;
int i,j=0;
String[] b;	 	
	FileReader fr = new FileReader("data.dat");
	BufferedReader br = new BufferedReader(fr);
	
	while((s = br.readLine()) != null)
	{
		//System.out.println(s.charAt(0));
		System.out.println(s);
				
	fr.close();
	

} catch (IOException e){
System.out.println("Error!"+e);
}}}
Z Konsoli mam to w s to sa pojedyncze zdania wyswietlane z kazdym wywolaniem while:

  1. Gestalt feature description:
  2. Lines: L[frame] [x0] [y0] [x1] [y1]
  3. Rectangles: R[frame] [x0] [y0] [x1] [y1] [x2] [y2] [x3] [y3]

Lines:

L0 61 312 90 323
L0 90 323 125 327
L0 125 327 184 365
L0 184 365 191 371
L0 191 371 191 375

Lines:

L1 61 312 90 323
L1 90 323 125 327
L1 125 327 191 370
L1 191 370 191 375
L1 191 375 183 402
L1 183 402 179 402
L1 179 402 45 325

Rectangles:

R0 533 48 523 51 518 38 530 33
R0 170 345 160 347 139 314 45 306
R0 29 54 30 51 65 64 65 66

Rectangles:

R2 358 149 432 126 448 209 373 224
R2 448 210 373 224 358 149 432 126
R2 371 224 358 149 432 126 448 210

Czyli sie wczytało, ale jak teraz chce sprawdzic pierwszy znak kazdego zdania to wyskakuje mi to:
Wyskakuje wlasnie to:

java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(Unknown Source)
at odczyt.main(odczyt.java:21)

Pryeczytal z dwoch pierwszych lini pierwsze znaki ale potem to juz nie

0

Sprobowałem cos takiego, ale tez nie lepiej:

Mam plik:

Lines:

L0 61 312 90 323
L0 90 323 125 327
L0 125 327 184 365
L0 184 365 191 371
L0 191 371 191 375

Lines:

L1 61 312 90 323
L1 90 323 125 327
L1 125 327 191 370
L1 191 370 191 375
L1 191 375 183 402
L1 183 402 179 402
L1 179 402 45 325

Rectangles:

R0 533 48 523 51 518 38 530 33
R0 170 345 160 347 139 314 45 306
R0 29 54 30 51 65 64 65 66

Rectangles:

R2 358 149 432 126 448 209 373 224
R2 448 210 373 224 358 149 432 126
R2 371 224 358 149 432 126 448 210

Odczyt pierwszego znaku. Wychodzi na to, ze pustej lini nie trawi

L
L
L
L
L
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(Unknown Source)
at odczyt.main(odczyt.java:21)

0

Ok jak mam tak bez pustych lini to jest ok

  1. Gestalt feature description:
  2. Lines: L[frame] [x0] [y0] [x1] [y1]
  3. Rectangles: R[frame] [x0] [y0] [x1] [y1] [x2] [y2] [x3] [y3]
  4. Lines:
    L0 61 312 90 323
    L0 90 323 125 327
    L0 125 327 184 365
    L0 184 365 191 371
    L0 191 371 191 375

Lines:

L1 61 312 90 323
L1 90 323 125 327
L1 125 327 191 370
L1 191 370 191 375
L1 191 375 183 402
L1 183 402 179 402
L1 179 402 45 325

Rectangles:

R0 533 48 523 51 518 38 530 33
R0 170 345 160 347 139 314 45 306
R0 29 54 30 51 65 64 65 66

Rectangles:

R2 358 149 432 126 448 209 373 224
R2 448 210 373 224 358 149 432 126
R2 371 224 358 149 432 126 448 210

Wynik pierwszego znaku:

L
L
L
L
L

L
L
L
L
L
L
L

R
R
R

R
R
R

0

Ok, waruneczki dzialaja

import java.io.*;

public class odczyt {

public static void main (String args[]){

try
{

String s;
int i,j=0;
String[] b;	 	
	FileReader fr = new FileReader("data.dat");
	BufferedReader br = new BufferedReader(fr);
	
	while((s = br.readLine()) != null)
	{
		if(s.charAt(0)=='L'){
			if(s.charAt(1)=='0'){
			
				b = s.split("  ");
				for(i=0;i<b.length;i++){
				System.out.println(b[i]);									
					}}}}
	fr.close();	

} catch (IOException e){
System.out.println("Error!"+e);}}}
Wynik:
L0
125
327
184
365
L0
184
365
191
371
L0
191
371
191
375

Teraz che zapisac to w tabeli. Jak zrobic, zeby tabela z tymi wartosciami miala podpis L0? Tylko tak zmienna nazwac? A jeszcze jedno ta tabela jakos dynamicznie wypelniana musi byc tylko gdzie ja i jak deklarowac bo mi wyskakuje, ze musze inicjalizowac.
Ma byc tablica L0 z trzema wierszami i czterema kolumnami gdzie sa integery.

0

Hej!
Teraz nie wiem jak mozna to rozwiazac. Chce teraz zapisac to w tablicy, ale jak ja deklaruje bez wymiaru jak nizej

try
{

String s;
int i,j=0;
String[] b;	 
int[] tab;

	FileReader fr = new FileReader("data.dat");
	BufferedReader br = new BufferedReader(fr);
	
	while((s = br.readLine()) != null)
	{
		if(s.charAt(0)=='L'){
			if(s.charAt(1)=='0'){                                				
				b = s.split("	");
				for(i=1;i<b.length;i++){				
					tab[i]=Integer.parseInt(b[i]);						
			}
		}
	}	
		int k=j++;		
		System.out.println(n);			
			//for(int z=0;z<2;z++){
				//board1[k][z]=board[z];			
	}
	//}	
	fr.close();	

} catch (IOException e)

to wyskakuje mi
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The local variable tab may not have been initialized

Jak ja zdefiniuje to jest ok, ale wtedy nie jest wypalniana dynamicznie.
Jak zapisac te dane w tablicy?

0

Nie używaj tablic tylko kolekcje (np. ArrayList).

0

Ok, mam cos takiego juz
while((s = br.readLine()) != null)
{
if(s.charAt(0)=='L'){
if(s.charAt(1)=='0'){
b = s.split(" ");
for(i=1;i<b.length;i++){
n=Integer.parseInt(b[i]);
al.add(n);
//System.out.println(al);
}
}
}
int k=j++;
System.out.println(al);
al.removeAll(al);
//for(int z=0;z<2;z++){
//board1[k][z]=board[z];

	}
	//}
	
	fr.close();
	
	

} catch (IOException e){

ale to co dostaje mi sie nie podoba, bo myslalem, ze tym wypelnie tablice:

[]
[]
[]
[61, 312, 90, 323]
[90, 323, 125, 327]
[125, 327, 184, 365]
[184, 365, 191, 371]
[191, 371, 191, 375]
[]
[]
[]
[]
[]
[]
[]
[]

to co jest w srodku podoba mnie sie ale te nawiasy.
Jak tym teraz mozna wypelnic tablice czy moze zostac przy array i na tym dzialania przeprowadzac
Bo jak wywolam liste za try to jest cos takiego:
[61, 312, 90, 323, 90, 323, 125, 327, 125, 327, 184, 365, 184, 365, 191, 371, 191, 371, 191, 375]

tylko, ze tu teraz sa trzy linie i nie wiadomo bardzo, ktora gdzie sie zaczyna, konczy. Dodatkowo sa tu x i y co drugi wyraz. Moze dalo by sie jakos to podzielic?

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