Arraycopy kopiert nur die Referenz?!

BruteForce

Neues Mitglied
Hallo zusammen,

ich schreibe derzeit an einem Sudoku-Löser, der mithilfe von BruteForce das Sudoku löst. Wenn ein Thread sich damit beschäftigt, läuft alles rund. Nun wollte ich das ganze beschleunigen und wollte dazu einen zweiten Thread in die entgegengesetzte Richtung bruteforcen lasse. Dieser Thread darf natürlich nicht das gleiche int[][]-Array wie der erste bekommen, sonst kommt keiner zum richtigen Ergebnis.

Das Array-Kopieren hab ich zunächst mit .clone() versucht, aber auch mit System.arraycopy() klappt es nicht :eek:

Hier mal ein bisschen Code:

Thread-Ersteller-Klasse:
Java:
//Im Kunstruktor wird das Feld "mySudoku" korrekt in das Objekt kopiert.

@Override public void run()
{
System.arraycopy(mySudoku, 0, copy, 0, mySudoku.length);
System.arraycopy(mySudoku, 0, copy2,0, mySudoku.length);
			
firstCore = new SudokuBruter(copy, 0, this);
secondCore= new SudokuBruter(copy2, 1, this);
// [...]
secondCore.start();
firstCore.start();
}


Der SudokuBruter:
Java:
public SudokuBruter(int[][] gotSudoku, int Tmode, SudokuBruteForce mum) {
	OwnSudoku = gotSudoku;
	mode = Tmode;
	parent = mum;
}

@Override public void run()
{  
System.out.println("Mode " + mode + " got started");
printSudoku(OwnSudoku);  //Sudoku ausgeben ---> Hier entstehen seltsame Ausgaben
if(nextfield(OwnSudoku, mode)){ //Rekursiv das Sudoku bruteforcen (klappt auch wunderbar)
	parent.finishSudoku(mode, OwnSudoku);  //gelöstes Sudoku an die Oberklasse reichen und drucken lassen (+ ggf. den anderen Thread interrupten)
} else {
System.out.println("Mode " + mode + " finished");
}
 }

In der Konsole entstehen dann folgende Ausgaben:
Bei einem Thread:

Code:
Start solving the Sudoku...
Mode 0 got started
 9       1   4       2  
   8       6       7    
                        

 4                   1  
   7               3    
 3                   7  

                        
   3       7       8    
 1       2   9       4  

Solved Sudoku:

 9 5 7   1 8 4   3 6 2  
 2 8 1   9 6 3   4 7 5  
 6 4 3   7 2 5   1 9 8  

 4 9 6   3 5 7   8 2 1  
 8 7 5   4 1 2   9 3 6  
 3 1 2   8 9 6   5 4 7  

 7 2 9   5 4 8   6 1 3  
 5 3 4   6 7 1   2 8 9  
 1 6 8   2 3 9   7 5 4  

Solved Sudoku was printed.

Alles wunderbar... Aber bei zwei Threads:

Code:
Start solving the Sudoku...
Mode 1 got started
 9       1   4       2  
   8       6       7    
                        

 4                   1  
   7               3    
 3                   7  

                        
   3       7       8    
 1       2   9       4  

Mode 0 got started
 9       1   4       2  
   8       6       7    
                        

 4                   1  
   7               3    
 3                   7  

                        
 9 3 2   4 7 5   1 8 6  // <--- Wo kommen diese zusätzlichen Zahlen her?! 
 1 6 7   2 8 9   3 5 4  // Hab ich das Array nur flach kopiert?
Mode 0 finished //Schon fertig? Achja, mit dem Array konnte man ja auch nichts weiter anfangen -.-

Reached iteration 18021344. 2% of worst case scenario.  //Diese Ausgaben mach ein anderer Thread (jede 1.5 Sekunden)
Reached iteration 32115093. 5% of worst case scenario.

Mode 1 finished
Solved Sudoku:

[...] <-- Sudoku wird ordentlich gelöst ausgegeben (siehe oben)

Das Problem beim zweiten Versuch ist, dass Mode 0 eigentlich als erster ein Ergebnis finden würde (statt nach 3 Sekunden, in 0.05 Sekunden). Aber warum bekommt Mode 0 so ein merkwürdiges Array o_O

Vielleicht kann mir jemand helfen und sagen, wo eventuell mein Fehler liegt, und wie ich nun in beide Threads ein autonomes Array reinschaufeln kann.

Schönen Tag euch noch ;)
 

codechaos

Mitglied
Be zweidimensionalen Arrays, wird nur eine Kopie des Äußeren erstellt. Du hast also zwei verschiedene Arrays, die wiederum die selben Arrays enthalten.

Java:
        int[][] k = new int[][] {{1,2},{3,4}};
        int[][] w = Arrays.copyOf(k, k.length);
        
        w[1][0] = 5;
        w[0] = new int[] {8,9};

        System.out.println(Arrays.deepToString(k));
        System.out.println(Arrays.deepToString(w));
 

BruteForce

Neues Mitglied
Ok :)
Dass beim "tiefen" Arraykopieren nur das äußere Feld kopiert wird, hätte man auch früher vermuten können :D

Mein Code sieht jetzt so aus:
Java:
//Deep-Array-Copy:
			
for(int i = 0; i < 9; i++){
	copy[i] = Arrays.copyOf(mySudoku[i], 9);
}

Und siehe da: alles flink und elegant :) Danke

Jetzt lässt sich auch dieser Worst-Case-Fall ( Sudoku algorithms - Wikipedia, the free encyclopedia ) innerhalb von 0.05 Sekunden lösen :lol: *so viel zum Thema worst-case*
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D arraycopy() will nicht Java Basics - Anfänger-Themen 3
L System.arraycopy() Java Basics - Anfänger-Themen 6
S arraycopy für mehrdimensionale Arrays? Java Basics - Anfänger-Themen 8
S System.arraycopy für Vectoren Java Basics - Anfänger-Themen 12
X besser als System.arraycopy(.) Java Basics - Anfänger-Themen 5
B FileWatcher : Erst Rückmeldung wenn komplett kopiert? Java Basics - Anfänger-Themen 3
W Datei wird aus resources unter Windows nicht kopiert Java Basics - Anfänger-Themen 1
T Methode, die eine 2 dimensionale Matrix kopiert. Java Basics - Anfänger-Themen 16
S Inhalt der Datei wird nicht kopiert ??? Java Basics - Anfänger-Themen 5
G Wird Objekt kopiert oder referenziert? Java Basics - Anfänger-Themen 6
P Kopiert Java objekte? Java Basics - Anfänger-Themen 6
Hzrfa Objekte, Referenz Java Basics - Anfänger-Themen 5
I Grundsatzfrage: Belegt eine Referenz auf 'null' RAM, und wenn ja - wieviel ;-) ? Java Basics - Anfänger-Themen 5
O Warum bekommen wir nicht die Referenz vom zurückgegebenen Objekt? Java Basics - Anfänger-Themen 4
P Wie rufe ich Methoden mit einer Referenz auf eine Klasse||Objekt auf Java Basics - Anfänger-Themen 4
C Kopie oder Referenz ? Java Basics - Anfänger-Themen 5
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
B Neue Liste erstellen, wenn Objekte bestimmte Referenz hat / Gruppierung von Einträgen Java Basics - Anfänger-Themen 12
Y Pointer / Referenz - Theorie Java Basics - Anfänger-Themen 3
H Referenz Objekt aufrufen Java Basics - Anfänger-Themen 12
D Uebergabe per Referenz Java Basics - Anfänger-Themen 2
O Referenz - toString Java Basics - Anfänger-Themen 9
S This-Referenz Java Basics - Anfänger-Themen 6
F Referenz an ein Objekt in einer anderen Klasse erstellen(Nullpointer exception) Java Basics - Anfänger-Themen 6
I Referenz auf Klasse als Rückgabewert Java Basics - Anfänger-Themen 7
P Datentypen LinkedList: Kopie behält Referenz? Java Basics - Anfänger-Themen 3
J Referenz und Instanzierung Java Basics - Anfänger-Themen 25
I Erste Schritte Referenz zum Knoten davor, in einer Liste Java Basics - Anfänger-Themen 4
M Referenz geht bei Zwischenspeichern verloren (ArrayList) Java Basics - Anfänger-Themen 4
8 Referenz (Pointer, Zeiger) in Java Java Basics - Anfänger-Themen 9
O This-Referenz als Returnwert einer Methode? Java Basics - Anfänger-Themen 13
O This Referenz Java Basics - Anfänger-Themen 3
A top referenz bei queues Java Basics - Anfänger-Themen 1
J Rückgabe als Wert, keine Referenz Java Basics - Anfänger-Themen 3
Q Parameterübergabe - Objekt - Referenz Java Basics - Anfänger-Themen 5
C Dynamische Referenz & abstrakte Klassen Java Basics - Anfänger-Themen 3
V Frage zu Polymorphismus: Objekt der Subklasse in Referenz der Oberklasse Java Basics - Anfänger-Themen 4
T Aufgerufene Methode Inhalt der übergebenen Referenz Java Basics - Anfänger-Themen 5
B Referenz in Java Java Basics - Anfänger-Themen 5
C Referenz auf ein Objekt kopieren! Java Basics - Anfänger-Themen 2
J Methoden Referenz und Speicherplatz für Objekte reservieren Java Basics - Anfänger-Themen 2
M Wie komm ich an die Referenz eines Oberflächenelements Java Basics - Anfänger-Themen 2
A Klassenvariablen Referenz auf ein Objekt Java Basics - Anfänger-Themen 18
M Referenz Frage Java Basics - Anfänger-Themen 12
K OOP Probleme mit Objekt-Referenz in Methode Java Basics - Anfänger-Themen 6
W Die leidige Referenz-Frage Java Basics - Anfänger-Themen 9
S Speicheradresse auf die eine Referenz zeigt ausgeben Java Basics - Anfänger-Themen 12
E Compiler-Fehler kann Objekt-Referenz nicht erstellen Java Basics - Anfänger-Themen 3
B Referenz zu anderen Frame Java Basics - Anfänger-Themen 10
Blackskyliner Referenz ähnlicher Zugriff, aber wie? Java Basics - Anfänger-Themen 4
K Klassen this-Referenz und Klassen/Methodenaufruf Syntax Java Basics - Anfänger-Themen 3
C Referenz einer bereits instanziierten Klasse während des Programmablaufs Java Basics - Anfänger-Themen 16
H Objekt holen per Referenz als String. Java Basics - Anfänger-Themen 4
T Referenz einer Variable übergeben Java Basics - Anfänger-Themen 3
S Datentypen Objekt Integer Referenz Java Basics - Anfänger-Themen 5
B Referenz auf Referenz Java Basics - Anfänger-Themen 3
Luk10 Problem mit Singleton bzw statischer Referenz! Java Basics - Anfänger-Themen 16
H ArrayList Zugriffe per Referenz verkürzen? Java Basics - Anfänger-Themen 9
B Static Referenz auf Non-static Feld Java Basics - Anfänger-Themen 6
Luk10 Sinn von Instanzierung ohne Referenz Java Basics - Anfänger-Themen 7
C0FFEE Referenz auf Methode übergeben Java Basics - Anfänger-Themen 2
aze NullpointerException :Null Referenz anzeigen lassen Java Basics - Anfänger-Themen 2
D Fehlen einer Referenz auf Objekt Java Basics - Anfänger-Themen 14
N this.referenz erläuterung Java Basics - Anfänger-Themen 2
K Attribut als Referenz auf Objekt Java Basics - Anfänger-Themen 8
K 3 Threads bearbeiten 1 Referenz: Ich versteh's nicht... Java Basics - Anfänger-Themen 2
P OOP-Theorie-Frage: Referenz auf Objekt Java Basics - Anfänger-Themen 27
D Referenz auf Objekt Java Basics - Anfänger-Themen 5
P Methode BigInteger-Array übergeben als Referenz Java Basics - Anfänger-Themen 6
U null-referenz Java Basics - Anfänger-Themen 26
deetee Problem mit Referenz auf Map Java Basics - Anfänger-Themen 5
G Interface referenz probleme Java Basics - Anfänger-Themen 10
V Return - JA/NEIN - Parameterübergabe Array (Referenz) Java Basics - Anfänger-Themen 7
D enum und Referenz der umgebenden Klasse Java Basics - Anfänger-Themen 2
C Referenz Java Basics - Anfänger-Themen 11
A ClassNotFoundException: Referenz nicht aktualisiert Java Basics - Anfänger-Themen 2
P Textarea aktualisieren, Referenz fehlt Java Basics - Anfänger-Themen 4
T Die this Referenz Java Basics - Anfänger-Themen 21
C Größe einer Referenz ? Java Basics - Anfänger-Themen 16
D Array reverse Problem, da Referenz nicht auf tmpArray zeigt Java Basics - Anfänger-Themen 4
G primitive Datentypen als Referenz an eine Methode übergeben Java Basics - Anfänger-Themen 2
G Wie Referenz auf Objekt übergebn Java Basics - Anfänger-Themen 8
P Objekte als Attribut: Referenz oder Kopie? Java Basics - Anfänger-Themen 3
G Parameterübergabe als Referenz bzw. als Kopie Java Basics - Anfänger-Themen 4
S Prüfen, ob null Referenz? Java Basics - Anfänger-Themen 2
G Referenz-Problem Java Basics - Anfänger-Themen 3
J Referenz problem Java Basics - Anfänger-Themen 12
D tiefergehende Java-Referenz Java Basics - Anfänger-Themen 3
M Referenz auf Membervariable Java Basics - Anfänger-Themen 5
G Objektübergabe als Referenz bei RMI Java Basics - Anfänger-Themen 2
J referenz auf noch nicht erzeugte objekte? Java Basics - Anfänger-Themen 2
G Rückgabe einer Kopie bzw. Referenz Java Basics - Anfänger-Themen 22
M Parameter als Referenz übergeben Java Basics - Anfänger-Themen 5
F Referenz Pointer oder doch nochmal neu suchen ? Java Basics - Anfänger-Themen 2
D Unterschied zwischen Referenz auf Objekt/Instanz von Objekt Java Basics - Anfänger-Themen 9
K Referenz auf Funktion Java Basics - Anfänger-Themen 6
J Referenz auf ein Objekt Java Basics - Anfänger-Themen 2
javasdann Referenz als String ausgeben. Java Basics - Anfänger-Themen 10
B Was ist eine Referenz? Java Basics - Anfänger-Themen 6
Z Zugriff auf Attribute nach Zuweisung einer Referenz Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben