HashMap vs if - else

Status
Nicht offen für weitere Antworten.

Lexi

Bekanntes Mitglied
Ich bin gerade dabei ein Bomberman Spiel zu schreiben. Dort habe ich jetzt eine move Methode implementiert, die die Spielfigur bewegen soll. Das man bei Bomberman nicht auf jedes Feld sondern, logischerweise, nur auf Hindernisfreie Felder treten kann, muss ich vorher abfragen ob das zu betretende Feld hindernisfrei ist. Zunächst hatte ich die 4 Richtungen in 4 Methoden aufgeteilt "moveUp(), moveRight() ...", doch das gefiel mir nicht so gut.

Java:
public boolean moveUp(Player player){
		int xPos = player.getXPos();
		int yPos = player.getYPos();
		
		if(fields[xPos][yPos-1].isBetretbar()){
			player.setYPos(yPos+1);
			return true;
		}
		return false;
	}

// usw ...

Dann habe ich versucht das ganze mit einer HashMap zu lösen:
Java:
Map<Integer,Point> moveOrders = new HashMap<Integer,Point>();
	
	
	public PlayGround() {
		moveOrders.put(PlayGround.MOVE_UP,new Point(0,-1));
		moveOrders.put(PlayGround.MOVE_RIGHT,new Point(1,0));
		moveOrders.put(PlayGround.MOVE_DOWN,new Point(0,1));
		moveOrders.put(PlayGround.MOVE_LEFT,new Point(-1,0));
            }

Java:
public boolean move(Player player, int moveOrderKey){
		int xPos = player.getXPos();
		int yPos = player.getYPos();
		
		Point moveOrder = moveOrders.get(moveOrderKey);
		if(fields[xPos+moveOrder.x][yPos+moveOrder.y]!=null){
			if(fields[xPos+moveOrder.x][yPos+moveOrder.y].isWalkable()){
				player.setPosition(xPos+moveOrder.x, yPos+moveOrder.y);
				return true;
			}
		}
		return false;
	}

So habe ich nur noch eine einzige Methode.

Was sagt ihr dazu ? Ist sowas ein günstiger Einsatz für eine HashMap oder hätte ich lieber bei meinen 4 Methoden bleiben sollen ?
 

Ebenius

Top Contributor
Ich würde ein enum verwenden und dort alles reintun:
Java:
public enum WalkDirection {

  UP(0, -1),
  DOWN(0, 1),
  LEFT(-1, 0),
  RIGHT(1, 0);

  public final int deltaX;
  public final int deltaY;

  /** Creates a new {@code WalkDirection}. */
  private WalkDirection(int dx, int dy) {
    this.deltaX = dx;
    this.deltaY = dy;
  }
}
Dann eine move-Methode:
Java:
public boolean move(Player player, WalkDirection dir) {
  int xPos = player.getXPos();
  int yPos = player.getYPos();

  if (fields[xPos + dir.deltaX][yPos + dir.deltaY] != null) {
    if (fields[xPos + dir.deltaX][yPos + dir.deltaY].isWalkable()) {
      player.setPosition(xPos + dir.deltaX, yPos + dir.deltaY);
      return true;
    }
  }
  return false;
}
... so in etwa ...

Ebenius
 
S

SlaterB

Gast
die eine Methode statt 4 ist sehr gut, die Map ist etwas diskussionswürdig,
durchaus schon eine gelungen kurze Umsetzung, aber vielleicht doch zu verwirrend in diesem Zusammenhang,

alternativ könntest du in der einen statt 4 Methoden auch folgendes vergleichsweise einfaches schreiben:
Java:
public boolean move(Player player, int moveOrderKey){
        int xPos = player.getXPos();
        int yPos = player.getYPos();
        
        if (moveOrderKey == PlayGround.MOVE_UP ||   moveOrderKey == PlayGround.MOVE_DOWN) {
           xPos += (moveOrderKey == PlayGround.MOVE_UP ? 1 : -1);
        } else {
           yPos += (moveOrderKey == PlayGround.MOVE_RIGHT ? 1 : -1);
        }    
        
        // oder noch besser
        switch (moveOrderKey) {
           case PlayGround.MOVE_UP:
               xPos++;
               break;
           case PlayGround.MOVE_DOWN:
               xPos--;
               break;
           ....
       }

        // prüfen ob Position außer Grenzen?
        Field f = fields[xPos][yPos];
        if(f !=null && f.isWalkable()){
            player.setPosition(xPos, yPos);
            return true;
        }
        return false;
    }

je mehr Möglichkeiten es gibt, desto schwieriger wird es, mit if/ else zu arbeiten,
switch sollte immer eine Alternative sein, benötigt aber mindestens 2 Zeilen (in einer extra-Methode mit return, drei mit break; )
während das Einfügen in eine Map wie bei dir vielleicht nur eine Zeile braucht ;)
(edit: zum Vergleich zu Ebenius Postings braucht die Enum auch eine Zeile)

bei 100 Elementen kann das schon was ausmachen ;)
 

Lexi

Bekanntes Mitglied
Also funktionieren tut das Enum genausogut wie die HashMap.
Nur leider komme ich da noch nciht so ganz hinter wie das ganze genau funktioniert.

Java:
  UP(0, -1),

Ist das ein Konstruktoraufruf ? Wenn ja wann wird der aufgerufen ?
Wenn ich
Java:
WalkDirektion dir = WalkDirektion.UP;
aufrufe ?
 

Marco13

Top Contributor
Die Dinger wie das "UP" sind Instanzen der Klasse WalkDirection, und das
UP(0,1)
ist tatsächlich fast das gleiche wie ein Konstruktoraufruf. Aufgerufen wird das ganze quasi (!) "beim Programmstart" (wenn der Classloader mal drüberrutscht oder so).

Hier gibt's noch mehr Info dazu: Enums

Die Intention, diese 4 Methoden in einer abzuhandeln, ist schon richtig. Eine Map verwendet man aber (grob gesagt) dann, wenn man "eine unbekannte Anzahl unbekannter Objekte auf andere Objekte abbilden will". In diesem Fall hast du aber eine bekannte Anzahl (nämlich 4) und auch bekannte Objekte (nämlich die "moveOrderKeys"). In so einem Fall würde man statt der Map einfach einen Array verwenden (davon ausgehend, dass die moveOrderKeys von 0 bis 4 durchnummeriert sind). Aber die enums sind in diesem Fall noch besser - eleganter und "sicherer" - wenn der moveOrderKey nur ein int ist, kann da jemand böses :mad: ja einfach mal -666 übergeben -> *knirsch* - bei enums geht nur das, was auch gehen soll.
 

Ebenius

Top Contributor
Du hast noch nicht so viel mit enums gearbeitet?
Java:
  UP(0, -1),

Ist das ein Konstruktoraufruf ?
Ja. Die vier Instanzen des WalkDirection-enum werden bei Initialisierung (das heißt spätestens direkt vor dem ersten Zugriff auf einen der Member) der Klasse WalkDirection aufgebaut. Es gibt nur genau diese vier Instanzen.

Mehr Infos findest Du im Sun Java™ Tutorial: Enum Types.

Ebenius
 

Ebenius

Top Contributor
Kann man sagen. UP, RIGHT, LEFT, DOWN sind jeweils ein Objekt mit genau jenen Instanzvariablen. Zusätzlich ist garantiert, dass es nur genau diese vier Instanzen gibt. Außerdem kann man sie super im switch-Statement nutzen.

Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
T HashMap Lsite gibt die sachen nicht aus wie gewollt. Java Basics - Anfänger-Themen 3
krgewb HashMap Java Basics - Anfänger-Themen 2
B Hashmap richtig bauen, die Tripel auf Zahl abbildet? Java Basics - Anfänger-Themen 10
"java.util.HashMap.get(Object)" is null Java Basics - Anfänger-Themen 10
berserkerdq2 Hashmap, wie prüfe ich ob ein Key schon existiert Java Basics - Anfänger-Themen 19
S Durch HashMap iterieren Java Basics - Anfänger-Themen 8
rafi072001 Sortieren einer HashMap nach Values Java Basics - Anfänger-Themen 2
F gson mit einer Hashmap Java Basics - Anfänger-Themen 2
J JSON-HashMap Java Basics - Anfänger-Themen 3
J Hashmap Java Basics - Anfänger-Themen 13
C Hashmap zickt Java Basics - Anfänger-Themen 9
S HashMap contains() Methode Java Basics - Anfänger-Themen 1
Z Satz aufteilen und die Wörter zählen (HashMap) Java Basics - Anfänger-Themen 15
N enum Attribut von Objekten einer Hashmap ausgeben Java Basics - Anfänger-Themen 6
P Verschachtelte Hashmap Java Basics - Anfänger-Themen 6
I Sortiert eine HashMap nicht gleich wie eine ArrayList? Java Basics - Anfänger-Themen 1
B HashMap alphabetisch sortieren Java Basics - Anfänger-Themen 2
J HashMap Java Basics - Anfänger-Themen 6
M Enum-Variable HashMap zuweisen Java Basics - Anfänger-Themen 5
U Hashmap Iterator selbst implementieren Java Basics - Anfänger-Themen 10
N HashMap in List good practice? Java Basics - Anfänger-Themen 2
K Value eines HashMaps in einer HashMap wiedergeben. Java Basics - Anfänger-Themen 5
O Hashmap, ArrayList, LinkedList Java Basics - Anfänger-Themen 7
O HashMap - ArrayList Java Basics - Anfänger-Themen 29
J Hashmap langsamer als compareTo? Java Basics - Anfänger-Themen 23
E HashMap+Vererbung Java Basics - Anfänger-Themen 11
J Erhöhen eines Values als Integer bei gleichen Keys in HashMap Java Basics - Anfänger-Themen 12
N Methoden HashMap interne Werte miteinander vergleichen Java Basics - Anfänger-Themen 7
W The type Long is not visible HashMap Java Basics - Anfänger-Themen 4
M Objekt mit Hashmap vergleichen Java Basics - Anfänger-Themen 22
S Gibt es für die Klasse HashMap Generic Implementierungen? Java Basics - Anfänger-Themen 11
C HashMap - alle keys haben values der letzten put-Anweisung Java Basics - Anfänger-Themen 3
J Hashmap auslesen Java Basics - Anfänger-Themen 7
F HashMap sortieren <String, Long> Java Basics - Anfänger-Themen 3
GreenTeaYT HashMap dupliziert meine Elemente? Java Basics - Anfänger-Themen 2
shiroX Methoden Morse-Code Übersetzer mit HashMap Java Basics - Anfänger-Themen 5
E HashMap Problem Java Basics - Anfänger-Themen 5
P Hashmap anstatt LinkedList? Java Basics - Anfänger-Themen 6
T HashMap und die Methoden Java Basics - Anfänger-Themen 13
N Methoden Interaktives PDF mit HashMap befüllen Java Basics - Anfänger-Themen 0
Z Hashmap auseinandernehmen und analysieren Java Basics - Anfänger-Themen 7
B Durchlaufen von Hashmap und Arraylist Java Basics - Anfänger-Themen 8
F HashMap oder welches Array? Java Basics - Anfänger-Themen 4
T HashMap Java Basics - Anfänger-Themen 24
L Hashmap mit variablem Key Java Basics - Anfänger-Themen 9
M Collections Probleme mit Hashmap Java Basics - Anfänger-Themen 4
N Collections String in HashMap umwandeln Java Basics - Anfänger-Themen 3
Z HashMap richtig benutzen Java Basics - Anfänger-Themen 2
lgund HashMap // TS3 Query Java Basics - Anfänger-Themen 7
Z Hashmap Iterator löscht nicht Java Basics - Anfänger-Themen 8
E Hashmap Wert auslesen Java Basics - Anfänger-Themen 2
S Printstream für einen Hashmap Loop Java Basics - Anfänger-Themen 1
dat_vin OOP Hashmap und Attribute Java Basics - Anfänger-Themen 7
C Check ob eine HashMap schon existiert Java Basics - Anfänger-Themen 16
P Vererbung Eigene HashMap Variante Java Basics - Anfänger-Themen 2
R Hashmap in anderer Klasse nicht benutzbar Java Basics - Anfänger-Themen 1
T Java Hashmap Java Basics - Anfänger-Themen 3
L Gibt es etwas wie "HashMap <String, String, String> Java Basics - Anfänger-Themen 9
K HashMap mit Daten aus ArrayList befüllen Java Basics - Anfänger-Themen 14
S OOP Klasse mit static-Eigenschaften - HashMap füllen Java Basics - Anfänger-Themen 6
O HashMap Fragen Java Basics - Anfänger-Themen 8
T HashMap Werte einfügen, durchsuchen und auslesen Java Basics - Anfänger-Themen 17
M Semantisches Problem HashMap/Netzwerk Java Basics - Anfänger-Themen 4
D HashMap Keys durchlaufen Java Basics - Anfänger-Themen 2
B Zugriff auf csv-Datei per hashmap Java Basics - Anfänger-Themen 5
M HashMap keys ausgeben Java Basics - Anfänger-Themen 2
S In einer Hashmap Klassen regestrieren Java Basics - Anfänger-Themen 2
H Collections Was ist schneller - HashMap + Sort v TreeMap? Java Basics - Anfänger-Themen 75
F HashMap nach kleinstem Value durchsuchen Java Basics - Anfänger-Themen 11
G HashMap Java Basics - Anfänger-Themen 6
F Wortpaare - HashMap - ArrayList Java Basics - Anfänger-Themen 6
M HashMap Frage Java Basics - Anfänger-Themen 3
M HashMap - put() reagiert nicht? Java Basics - Anfänger-Themen 8
N Cast eines Objektes in eine Hashmap Java Basics - Anfänger-Themen 13
A CSV Zeilenweise einlesen und in einer HashMap speichern Java Basics - Anfänger-Themen 12
A Input/Output Hashmap in einem JPanel via JList anzeigen Java Basics - Anfänger-Themen 8
K HashMap auf leere Key-Value-Paare prüfen Java Basics - Anfänger-Themen 14
F Hilfe bei der HashMap. Java Basics - Anfänger-Themen 3
F HashMap vs. TreeMap Java Basics - Anfänger-Themen 5
B HashMap Java Basics - Anfänger-Themen 9
C Collections String[] als value in HashMap Java Basics - Anfänger-Themen 6
V Hashmap Iterieren Java Basics - Anfänger-Themen 4
C Csv File in Hashmap ausgeben Java Basics - Anfänger-Themen 14
T HashMap<String,Object> Werte auslesen Java Basics - Anfänger-Themen 5
I HashMap sortieren Java Basics - Anfänger-Themen 10
I HashMap Java Basics - Anfänger-Themen 11
H Collections Brauche modifizierte HashMap Java Basics - Anfänger-Themen 6
H TreeMap/HashMap synchronisieren Java Basics - Anfänger-Themen 2
A Datentypen Hashmap to Array Java Basics - Anfänger-Themen 11
D HashMap überschreibt Werte Java Basics - Anfänger-Themen 7
pg1337 Interface Comparable-Interface bei HashMap Java Basics - Anfänger-Themen 21
D erweiterte hashmap Java Basics - Anfänger-Themen 5
H HashMap<Int, String> - Er findet die Int-Klasse nicht. Java Basics - Anfänger-Themen 3
L HashMap zu JList Java Basics - Anfänger-Themen 6
S Erste Schritte HashMap Kurze Frage - Werte über Schleife ausgeben Java Basics - Anfänger-Themen 30
F Collections ArrayList oder Hashmap mittel Collections.sychronised Java Basics - Anfänger-Themen 6
B Klassen HashMap Zwei Objekte, gleicher Key Java Basics - Anfänger-Themen 4
N HashMap fehlerhafte Rückgabe Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben