magisches Quadrat

Status
Nicht offen für weitere Antworten.

xuxu

Mitglied
Hallo Zusammen,

ich habe folgendes Problem:

Die Aufgabenstellung ist, aus einer Datei eine Matrix einzulesen und zu überprüfen ob diese Matrix ein magisches Quadrat ist (wer nicht weiß was das ist; bei einem magischen Quadrat ergeben alle Zeilen, Spalten und Diagonalen die selbe Summe (n(n²+1)/2).. bei einem Quadrat (3x3) also 15.. Hinzu kommt, daß jede Zahl nur einmal vorkommen darf und keine Position leer sein darf.).

Die Überprüfung ist auch keinerlei Problem, sondern das einlesen. Ich hab 3 verschiedene Dateien, die ich darauf testen soll. Die Zahlen sind durch leerzeichen von einander getrennt. Damit diese auch schön übersichtlich sind in der Datei, können sie auch mal durch 2+ Leerzeichen getrennt sein..

Zum Beispiel:
Code:
30 39 48  1 10 19 28
38 47  7  9 18 27 29
46  6  8 17 26 35 37
 5 14 16 25 34 36 45
13 15 24 33 42 44  4
21 23 32 41 43  3 12
22 31 40 49  2 11 20

(vor der 5 ist eigentlich auch ein Leerzeichen, scheint aber automatisch gekillt zu werden ^^).

Und genau das ist das Problem, ich muss die Leerzeichen loswerden und mit nur einem von einander trennen, damit ich die Werte mit split() in ein Array bekomme.

Nun zerbrech ich mir seit einer Stunde den Kopf.
Für die oben gepostete Beispieldatei klappt mein Algorithmus, aber nicht wenn mehr als 2 Leerzeichen zwischen den Zahlen oder am Anfang stehen. Ich hab`s mit regulären Ausdrücken versucht, mit ReplaceAll(), etc. Aber bisher keine immer funktionierende Lösung.

Weiß jemand Rat? (Wobei`s mich wundert, daß es keine Funktion gibt, die genau das macht (also, mehrfache Leerzeichen aus einem String killen.) oder war ich bloß blind in der API unterwegs? ^^).

Danke im Voraus für die Hilfe.
 

xuxu

Mitglied
Danke für die schnelle Antwort, aber die Lösung hatte ich auch versucht - klappt nicht.

Code:
zahlen = splitter.split(\\s+);

Wirft ne Exception..:


Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The method split(String) in the type String is not applicable for the arguments ()
Syntax error on tokens, delete these tokens

at P9_Auf1.main(P9_Auf1.java:106)


Code:
zahlen = splitter.split("\\s+");

Scheint dagegen syntaktisch richtig zu sein, wirft aber eine NullpointerException.

Soll ich mal den ganzen Programmcode posten?
 

Wildcard

Top Contributor
Ja, sorry... hatte die " vergessen.
Wenn dabei eine nullpointer exception fliegt, dann ist der String null.
Der eigentliche Fehler liegt also eher wo anders.
 

xuxu

Mitglied
Ja, das lag daran, daß am Anfang Teilweise auch ein Leerzeichen steht.
Die hatte ich eigentlich mit

Code:
if(b.startsWith(" "))
   b=b.substring(1);

rausgestrichen, aber klappt mit Deiner Lösung trotzdem nicht :/.
Ansonsten wüsste ich nicht, was das Problem sein soll:

Code:
try
		{
			BufferedReader br = new BufferedReader (new FileReader(file));
			String b = null;
			String splitter = null;
			int i=0;
			
			while((b = br.readLine()) != null)
			{
				if(i==0)
				{
					groesse=Integer.parseInt(b);
					magicnumber=(groesse*(groesse*groesse+1))/2;
					zahlen = new String[groesse];
					zahlen1 = new int[groesse];
					quadrat=new int[groesse][groesse];
				}
								
				else
				{
					
					if(b.startsWith(" "))
						b=b.substring(1);
					
					/*splitter=b.replaceAll("  "," ");
					zahlen = splitter.split(" ");*/
					
					zahlen = splitter.split("\\s+");
					
					for(int j=0; j<zahlen.length; j++)
					{	
						quadrat[(i-1)][j]=Integer.parseInt(zahlen[j]);
					}
				}
				
				i++;
			}
			
			br.close();
		}

???:L
 

xuxu

Mitglied
Perfekt. Danke Dir für den Tip mit trim() :) .

Das Problem jetzt lag an *hust* eigener Blödheit.
Durch das Auskommentieren, hab ich vergessen,
Code:
splitter=b;
zu setzen :roll:

Das Programm funktioniert jetzt einwandfrei, daher nochmals vielen Dank und ein schönes Wochenende :).
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben