Wie kommt dieses Ergebnis zu stande

Nico1999

Aktives Mitglied
ich würde gerne wissen wie der Computer auf dieses wierde ergebnis kommt
hier ist mein Code
alle sachen die ich verwendet habe sind getestet also sollte funktieren
Java:
    protected HashMap<Integer, Field[]> createBoard() {
        HashMap <Integer, Field[]>startingBoard=new HashMap<>();
        Field[] row=new Field[brettGröße];
        for(int collumnumber=0;collumnumber<this.brettGröße;collumnumber++) {
            startingBoard.put(collumnumber, row);
            for(int rownumber=0;rownumber<this.brettGröße;rownumber++) {
                if(isBlackField(collumnumber, rownumber)) {
                    if(collumnumber<this.brettGröße/2-1) {
                        startingBoard.get(collumnumber)[ rownumber]=new Field(new Coordinates(collumnumber, rownumber), new Figur(Typ.PAWN, Color.BLACK), Color.BLACK);
                    }else if(collumnumber>this.brettGröße/2) {
                        startingBoard.get(collumnumber)[ rownumber]=new Field(new Coordinates(collumnumber, rownumber), new Figur(Typ.PAWN, Color.WHITE), Color.BLACK );
                    }else {
                        startingBoard.get(collumnumber)[ rownumber]=new Field(new Coordinates(collumnumber, rownumber), new Figur(), Color.BLACK );
                    }
                }else {
                    startingBoard.get(collumnumber)[ rownumber]=new Field(new Coordinates(collumnumber, rownumber), new Figur(), Color.WHITE );
                }
            }
        }return startingBoard;
        
    
    }

Der Output ist jetzt das er für die X koordinate nur 7 printet egal welches Feld
alles andere funktiert Danke schonmal für eure Antworten
(die Y koordinate macht er komplett Richtig )
und Ich wollte ma fragen wie viel Variablen ein Klasse maximal haben sollte
 

Marinek

Bekanntes Mitglied
Deine Modellierung eines Schachbretts ist extrem kompliziert.

Man kann ein Schachbrett simpel mit

Java:
Figur[][] brett = new Figur[][];

annehmen.

Dann spart man sich das Field und Coordinates.

Deine Frage kann aber hier nicht beantwortet werden, weil weder die Berechnung noch der Input bekannt sind.

Code:
Field[] row=new Field[brettGröße];
        for(int collumnumber=0;collumnumber<this.brettGröße;collumnumber++) {
            startingBoard.put(collumnumber, row); // Ist es Absicht, dass in jeder Spalte die gleiche Zeile ist!?
 
Y

yfons123

Gast
Welcher Output? Und warum hast Du hier eine HashMap, wenn Du nur Indizes als Keys hast? Dann kannst Du auch einfach ein Array verwenden. Den Code kannst Du auch noch schöner aufteilen.
da ich ihm das ursprünglich vorgeschlagne habe um buchstaben + zahl zu haben... ala C6 un D4 also char als keys aber das wurde untershclagen
 

Nico1999

Aktives Mitglied
Welcher Output? Und warum hast Du hier eine HashMap, wenn Du nur Indizes als Keys hast? Dann kannst Du auch einfach ein Array verwenden. Den Code kannst Du auch noch schöner aufteilen.
da hast du recht später werde ich den code noch in weitere funktionen packen
wollte mal die HashMap ausprobieren
Code:
Field[] row=new Field[brettGröße];
        for(int collumnumber=0;collumnumber<this.brettGröße;collumnumber++) {
            startingBoard.put(collumnumber, row); // Ist es Absicht, dass in jeder Spalte die gleiche Zeile ist!?
das habe ich gemacht das ich keine NullpointerException bekomme
da ich ihm das ursprünglich vorgeschlagne habe um buchstaben + zahl zu haben... ala C6 un D4 also char als keys aber das wurde untershclagen
sry ich hatte dass mit den Buchstaben mal probiert aber ich wusste nicht wie ich mit denen rechnen soll

Das Ding ist halt ich hab mir das im debug mode angeguckt und wenn collumnumber sich erhöht auf 1 wird auch in dem
startingBoard.get(0)[0].getCoordinates().getX(), dass eigentlich schon richtig abgespeichert wurde jetzt auf 1 erhöht
}also wenn sich collumnumber auf 1 wird ein schon abgespeichertes Field im Nachhinnein verändern aber ich habe keine ahnung wo die herkommen soll?
 

KonradN

Super-Moderator
Mitarbeiter
das habe ich gemacht das ich keine NullpointerException bekomme
Damit hast Du aber nur eine einzige row - und die hast Du mehrfach in der Liste eingefügt.
Somit überschreibst Du in der äußeren Schleife immer wieder die Werte der Row und Du hast am Ende nur die Werte vom letzten Durchgang.

Die Erzeugung der Row muss also in die Schleife:
Java:
        for(int collumnumber=0;collumnumber<this.brettGröße;collumnumber++) {
            Field[] row=new Field[brettGröße];
            startingBoard.put(collumnumber, row);
 

mihe7

Top Contributor
wollte mal die HashMap ausprobieren
OK, man kann das Spielbrett natürlich als Menge von Feldern auffassen, die ihre Lage auf dem Spielbrett kennen. Für den Zugriff auf ein Feld über seine Koordinaten lässt sich eine Map verwenden, wobei es sich dann aber anbieten würde, auch Koordinaten auf Felder abzubilden.

Java:
Map<Coordinates, Field> board = new HashMap<>();

private void add(Field field) {
    board.put(field.getCoordinates(), field);
}

Ob das sinnvoll ist, ist eine ganz andere Frage. Für ein simples Schachbrett ist das wohl etwas übertrieben. Interessant kann so etwas zum Beispiel sein, wenn man große, "dünnbesetzte" Welten hat. Wenn man z. B. einen 1000 x 1000 x 1000 Würfel hat, in dem es 10.000 Felder gibt, dann wäre es ziemlich doof, für die 10.000 Felder Platz für 1.000.000.000 Array-Elemente zu reservieren.
 

Nico1999

Aktives Mitglied
Damit hast Du aber nur eine einzige row - und die hast Du mehrfach in der Liste eingefügt.
Somit überschreibst Du in der äußeren Schleife immer wieder die Werte der Row und Du hast am Ende nur die Werte vom letzten Durchgang.

Die Erzeugung der Row muss also in die Schleife:
Java:
        for(int collumnumber=0;collumnumber<this.brettGröße;collumnumber++) {
            Field[] row=new Field[brettGröße];
            startingBoard.put(collumnumber, row);
okay dass war mir nicht bewusst, dass das so einen großen unterschied macht.
danke
OK, man kann das Spielbrett natürlich als Menge von Feldern auffassen, die ihre Lage auf dem Spielbrett kennen. Für den Zugriff auf ein Feld über seine Koordinaten lässt sich eine Map verwenden, wobei es sich dann aber anbieten würde, auch Koordinaten auf Felder abzubilden.

Java:
Map<Coordinates, Field> board = new HashMap<>();

private void add(Field field) {
    board.put(field.getCoordinates(), field);
}

Ob das sinnvoll ist, ist eine ganz andere Frage. Für ein simples Schachbrett ist das wohl etwas übertrieben. Interessant kann so etwas zum Beispiel sein, wenn man große, "dünnbesetzte" Welten hat. Wenn man z. B. einen 1000 x 1000 x 1000 Würfel hat, in dem es 10.000 Felder gibt, dann wäre es ziemlich doof, für die 10.000 Felder Platz für 1.000.000.000 Array-Elemente zu reservieren.
wie wäre es den am platzsparenstens, weil später möchte ich auch noch einen algorithmus anwenden der mir für Dame(Spiel) alle möglichen Moves ausrechnet. Das angenehme an dem Feld Array ist ich kann erst mal alle Weißen Felder ausklammern weil auf denen steht ja eh nix drauf
ah und nice ich dachte man kann nur bei der einer Seite der HashMap eigene Klassen rein tun
 
Zuletzt bearbeitet:
Y

yfons123

Gast
du kannst mit der hashmap genau das gleiche machen wie mit einem array da es nur ein Container außen rum ist mehr oder weniger

Speicher soll dich nicht interessieren


was für alle moves wichtig ist ist die Zeit, wenns 100 Jahre dauert hilft dir die Lösung relativ wenig
 

mihe7

Top Contributor
wie wäre es den am platzsparenstens
Wie @yfons123 schon geschrieben hat: der Platz braucht Dich nicht zu interessieren. Wir reden hier von 64 Feldern.

Das angenehme an dem Feld Array ist ich kann erst mal alle Weißen Felder ausklammern weil auf denen steht ja eh nix drauf
So etwas wäre schon eher ein Argument, allerdings kann man das ganz leicht berechnen. Es gibt je Zeile 4 schwarze Felder, so dass sich unter der Annahme, dass (0,0) ein schwarzes Feld ist, der Spaltenindex für das (i+1)-te schwarze Feld mit 2*i + row % 2 berechnen lässt.
Java:
public void iterateBlackFields() {
    for (int row = 0; row < 8; row++) {
        for (int col = row % 2; col < 8; col += 2) {
            // (col, row) ist schwarzes Feld
        }
    }
}

ah und nice ich dachte man kann nur bei der einer Seite der HashMap eigene Klassen rein tun
Nö, das geht im Prinzip mit beliebigen Objekten. Einzige Voraussetzung ist, dass der equals/hashCode-Vertrag (zwei Objekte, die per equals gleich sind, müssen den gleichen hashCode liefern) eingehalten wird. Außerdem sollte man es tunlichst unterlassen, den Wert eines Schlüssels im Nachhinein zu ändern, weswegen sich unveränderliche Objekte besonders gut für Schlüssel eignen.
 

Nico1999

Aktives Mitglied
Nö, das geht im Prinzip mit beliebigen Objekten. Einzige Voraussetzung ist, dass der equals/hashCode-Vertrag (zwei Objekte, die per equals gleich sind, müssen den gleichen hashCode liefern) eingehalten wird. Außerdem sollte man es tunlichst unterlassen, den Wert eines Schlüssels im Nachhinein zu ändern, weswegen sich unveränderliche Objekte besonders gut für Schlüssel eignen.
also meine Coordinates sind final, aber jetzt wo ich das mit der einer HashMap <Coordinates, Figur> ausprobiert habe laufe ich jetzt in einen
java.lang.outOfMemoryError: Java heap space
im prinzip hab ich nur nochmal das selbe wie vorhergemacht ich habe keine Ahnung was da jetzt so schief geht
Java:
protected HashMap<Coordinates, Figur> createBoard(){
        HashMap<Coordinates, Figur> createBoard=new HashMap<Coordinates, Figur>();
        for(int i=0;i<brettGröße;i++) {
            for(int j=0;i<brettGröße;j++) {
                if(onCoordinatesXYIsBlackField(i, j)) {
                    if(i<brettGröße/2-1) {
                        createBoard.put(new Coordinates(i,j), new Figur(Typ.PAWN, Color.BLACK));
                    }else if(i>brettGröße/2) {
                        createBoard.put(new Coordinates(i,j), new Figur(Typ.PAWN, Color.WHITE));
                    }else {
                        createBoard.put(new Coordinates(i,j), new Figur());
                    }
                }else {
                    createBoard.put(new Coordinates(i,j), new Figur());
                }
            }
        }
        return createBoard;
    }
was muss ich da noch ändern ?
und wie rufe ich dann was aus der HashMap auf etwa so ?
Code:
HashMap<Coordinates, Figur> map=new HashMap<>();
map.get(new Coordinates(0,0))
 

Jw456

Top Contributor
Code:
HashMap<Coordinates, Figur> map=new HashMap<>();
map.get(new Coordinates(0,0))
Wenn in der Map unter dem Key „new Coordinates(0,0)“ ein Eintag ist bekommst du das Value „ Fiur“ zurück wenn nicht dann „Null“



Wenn du eine Figur bewegst wirst du den alten Key ( das Feld auf dem Brett) löschen müssen „remove.“ Die Figur an der neuen stellen in der Map mit der neuen Pos (Key) mit „put“ speichern.
 

Jw456

Top Contributor
Wenn in der Map unter dem Key „new Coordinates(0,0)“ ein Eintag ist bekommst du das Value „ Figur“ zurück wenn nicht dann „Null“

Kleine Berichtigung
Die Map wird sich als „ Key“ die Instanz von dem Objekt merken. Da du die nicht hast wirst du den Key (Instanz) wahrscheinlich nicht wider finden.
Wenn du also prüfen möchtest ob auf Feld 0,0 eine Figur ist wirst du mit „new Coordinates(0,0)“ kein glück haben da das ja jetzt ein anders Objekt ist als das was in der Map ist. Du wirst Null zurück bekommen.
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Kleine Berichtigung
Die Map wird sich als „ Key“ die Instanz von dem Objekt merken. Da du die nicht hast wirst du den Key (Instanz) wahrscheinlich nicht wider finden.
Wenn du also prüfen möchtest ob auf Feld 0,0 eine Figur ist wirst du mit „new Coordinates(0,0)“ kein glück haben da das ja jetzt ein anders Objekt ist als das was in der Map ist. Du wirst Null zurück bekommen.
Wenn er equals und Hashcode sinnvoll überschrieben hat, dann wird die Nutzung von Coordinates auch als Key in der HashMap funktionieren.
Und das wurde von @mihe7 in #10 auch entsprechend als Notwendigkeit formuliert, so dass ich davon ausgehen, dass es auch umgesetzt wurde.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Wo kommt der Wert der Variable her ? Allgemeine Java-Themen 6
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
B OutOfMemoryError kommt nicht/Bug in Java? Allgemeine Java-Themen 2
N [GWT] JavaMail kommt nicht an Allgemeine Java-Themen 9
A Compiler-Fehler Woher kommt der NullPointer? (Collections & Iterator) Allgemeine Java-Themen 7
S Warten, bis ein Impuls von außen kommt. Allgemeine Java-Themen 2
P Ascii Bild aus einem input file nur kommt nix im outputfile an?????? Allgemeine Java-Themen 5
F Geworfene Exception kommt nicht an Allgemeine Java-Themen 6
D Fehler, woher kommt er? Allgemeine Java-Themen 9
F Weiß nicht warum Exception kommt Allgemeine Java-Themen 15
N Xor Warum kommt Flasches Zeichen in Java Allgemeine Java-Themen 36
G Warum kommt hier NullPointerException? Allgemeine Java-Themen 3
M HashMap kommt beim Löschen aus dem Tritt Allgemeine Java-Themen 6
E JExcel- Zugriff auf leere Zellen kommt eine Fehlermeldung Allgemeine Java-Themen 6
T Fehlersuche bzw. woher kommt diese ausgabe? Allgemeine Java-Themen 2
C ge2001.exe - Hilfe kommt bei F8 (run) in JCreator Allgemeine Java-Themen 22
R Objekttyp ermitteln das aus generischer Collection kommt Allgemeine Java-Themen 3
P Wann kommt denn nun 1.5 überhaupt? Allgemeine Java-Themen 6
M Warum hat Java dieses und jenes nicht... Allgemeine Java-Themen 8
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
H was ist den dieses zur Kompilierzeit und zur Laufzeit in Java? Allgemeine Java-Themen 3
Thallius Wie parse ich dieses Datum richtig? Allgemeine Java-Themen 5
M Dieses Programm schneller machen? Allgemeine Java-Themen 2
O Compiler-Fehler Wie kompiliere ich dieses Alt-Projekt ? Allgemeine Java-Themen 9
D File mit Inhalt kopieren und dieses File dann neu erstellen ? Allgemeine Java-Themen 4
cedi int Zahl in ein ASCII zeichen umwandeln und dieses in ein externes Textfenster schreiben Allgemeine Java-Themen 6
T Wie intelligent ist dieses überschriebene .equals() ? Allgemeine Java-Themen 13
M Wie heißt denn dieses grafische Element ? Allgemeine Java-Themen 2
L Wie kann man dieses "Table" Problem am besten löse Allgemeine Java-Themen 8
D wie gliedere ich dieses programm am besten? dringend! Allgemeine Java-Themen 3
B Wie heißt dieser kleine Typ links oben? Also dieses JavaVieh Allgemeine Java-Themen 5
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
OnDemand XML desializing Attribute bringt nicht erwartetes Ergebnis Allgemeine Java-Themen 16
Y Falsches Ergebnis mit "/" Operator Allgemeine Java-Themen 2
S Seltsames Ergebnis mit Date-Klasse Allgemeine Java-Themen 6
H float Berechnung: Ergebnis ohne wissenschaftliche Notation Allgemeine Java-Themen 5
M Falsches Ergebnis bei Rechnung Allgemeine Java-Themen 1
T If Vergleich ergibt nicht das richtige Ergebnis Allgemeine Java-Themen 2
J-Gallus Erste Schritte Wahrscheinlich Anfänger Fehler beim rechnen. Falsches Ergebnis. Allgemeine Java-Themen 9
Chr1s ergebnis = Zahl? Allgemeine Java-Themen 3
R Threads asynchrone Tätigkeit mit Ergebnis Auswertung Allgemeine Java-Themen 4
D Timestamp to Date, ergibt falsches ergebnis Allgemeine Java-Themen 5
Antoras Micro-benchmark für parallel vs. sequentiell erzeugt unerwartetes Ergebnis Allgemeine Java-Themen 8
S Ergebnis von Cursor c1 mit Cursor c2 vergleichen Allgemeine Java-Themen 3
M 2 Methoden, 2 Rückgabewerte, aber ein Ergebnis Allgemeine Java-Themen 7
N contains(.) liefert nicht erwartetes Ergebnis Allgemeine Java-Themen 3
M richtiges Ergebnis zählen und übergeben? Allgemeine Java-Themen 7
D Wann ist das ergebnis einer Rechnung eine Double? Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben