PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sudoku aus Textdatei in einen Zweidimensionalen Array einlesen.



mrzl
10.06.2010, 10:02
Hallo Leute,
ich bin hier neu und werde euch gleich einmal versuchen auszunutzen, um meine Programmieraufgabe aus der Uni zu lösen ;) (scherz)

Ich habe das Problem, dass ich nicht weiss, wie ich ein 9x9 Sudoku aus einer Textdatei in einen zweidimensionalen Array einlesen soll. Ich habe schoneinmal einige Versuche gestartet, allerdings funktioniert es nicht so, wie ich es will- vielleicht könnt ihr mir ja weiterhelfen! :-)

Inhalt der sudoku.txt


100503089
090070200
600000003
400080130
067030490
001040008
900000006
004010020
720809001


Meine Klasse:


public class Sudoku {
static String[] dateiZeilen=new String [9];

//static final char TRENNER=';';
static int[][] sudokuarray=new int[10][10];

public static int[][] leseTxtInZweidimensionalesArray() throws IOException {
String zahlencode = "sudoku.txt";
FileReader fileReader;
try{
fileReader = new FileReader (zahlencode);
BufferedReader bufferedReader = new BufferedReader(fileReader);

for(int x=0;x<zahlencode.length();x++)
{
for(int i=0;i<zahlencode.length();i++)
{
sudokuarray[x][i]=new Integer(zahlencode.charAt(i));

}
}}catch (FileNotFoundException e){
System.out.println("Datei wurde nicht gefunden");
}catch (IOException e){
e.printStackTrace();
}

return sudokuarray;
}

public static void main(String[] args) throws IOException {

leseTxtInZweidimensionalesArray();
System.out.println(sudokuarray[0][8]);
}
}



Falls ihr Lust habt, könnt ihr euch ja da reindenken und etwas vorschlagen.
Vielen Dank schonmal im Voraus!

Euer Marcel

EBFE
10.06.2010, 10:58
Ich hab das mal etwas kommentiert und "arbeitsfähig" gemacht, ohne den logischen Ablauf zu ändern. Mir scheint es allerdings so, als ob du die vorhergehenden Aufgaben nicht wirklich bearbeitet hast ;)
Btw: schon länger kein Java mehr gemacht, daher keine Garantie auf Java-Coding-Convention "Korrektheit"


import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Sudoku {
static String[] dateiZeilen=new String [9];

//static final char TRENNER=';';

//static int[][] sudokuarray=new int[10][10]; <--- Warum 10x10 Feld?
static int[][] sudokuarray = new int[9][9];

// (0) Klammerung einheitlich gestalten
// (1) Benennung sollte eigentlich in englisch sein ;)
// (2) Variablen/Methodennamen sollten zwar aussagekräftig,
// aber trotzdem möglichst kurz gehalten werden ;)
public static int[][] leseTxtIn2DArray() throws IOException
{
String zahlencode = "sudoku.txt";
FileReader fileReader;
try
{
fileReader = new FileReader (zahlencode);
BufferedReader bufferedReader = new BufferedReader(fileReader);

//(3) indentation einheitlich gestalten!

//for(int x=0;x<zahlencode.length();x++) <---
// soll also solange einlesen, wie der Dateiname lang ist? ;)
// lieber: entweder festkodieren oder solange Datei noch lesbar ist
// hier die einfache Variante:
for (int i = 0; i < sudokuarray.length; i++)
{
//for(int i=0;i<zahlencode.length();i++) <---
//hier das gleiche - der Dateiname hat nix mit der Datei selbst
//am Hut
for (int j = 0; j < sudokuarray[0].length; j++)
{
int input;
//wir wollen nur Zahlen 0 bis 9 haben, den Rest ignorieren
do
{
input = bufferedReader.read();
// -1 wird zurückgegeben, wenn die Datei zu Ende ist, da wir und aber in der Zeit immer
// noch in der Schleife befinden, heißt es schlicht, dass die Sudokudatei nicht 9x9 Feld entspricht
if (input == -1)
//Hier sollte man vielleicht eine passendere Exception nachschlagen - dazu war ich aber zu faul ;)
throw new IOException("Datei unvollständig");
}while (Character.isDigit(input) != true);
//kürzer und gebräuchlicher:
//while (!Character.isDigit(input))
sudokuarray[i][j] = Character.digit(input, 10);
}
}
}catch (FileNotFoundException e)
{
System.out.println("Datei wurde nicht gefunden");
}catch (IOException e)
{
e.printStackTrace();
}

return sudokuarray;
}

public static void prettyPrint2DArray(int[][] arr)
{
for (int i = 0; i < arr.length; i++)
{
for (int j = 0; j < arr[0].length; j++)
System.out.print(arr[i][j]);

System.out.println();
}

}
public static void main(String[] args) throws IOException
{
leseTxtIn2DArray();
// was passiert, wenn beim Einlesen ein Fehler aufgetreten ist?
// sollte das Array dann lieber nicht ausgegeben werden?
System.out.println(sudokuarray[0][8]);
prettyPrint2DArray(sudokuarray);
}
}

mrzl
10.06.2010, 12:54
Hey, danke für die schnelle Antwort. :-)
Ich habe die vorangehenden Aufgaben sogar ziemlich gut bearbeitet, allerdings, haben die mich nicht auf diese Aufgabe vorbereitet- an meiner Uni wird man bei Java ziemlich ins kalte Wasser geworfen und sich selbst überlassen- ziemlich schwierig, wenn man keine Vorkenntnisse hat.

Zu deinem veränderten Code:
Leuchtet mir soweit schoneinmal alles ein, plötzlich komm' ich mir so dämlich vor, wenn ich meine Version ansehe. Am meisten ärgert mich der Denkfehler im bezug darauf, dass ich die Datei so lang einlese, wie der Dateinamen lang ist. Wirklich blöd von mir- aber einmal muss man ja soeinen Fehler machen :D

Ich danke dir auf jeden Fall!

Grüße,
mrzl