2016-05-26 8 views
-1

Ich habe das Problem, dass meine equals-Methode nicht funktioniert, wie ich es will. Ich möchte eine deterministische Turing-Maschine implementieren, also möchte ich die Methode findCommand() hinzufügen, die eine Arraylist von Befehlen durchsucht. Also entschied ich mich, einen searchDummy zu erstellen, um alle Übergänge zu finden, die für die Konfiguration verfügbar sind, die ich habe.meine deterministische Turing-Maschine wird nicht funktionieren, weil meine equals und indexof-Methode keinen Quellenfehler werfen

Klasse Staaten:

public class States { 

private int stateId; 
private boolean rejState; 
private boolean accState; 
private boolean stopState; 
private List<Commands> commands = new ArrayList<Commands>(); 

in Klasse Staaten gleich:

@Override 
public boolean equals(Object other) { 
    if (this == other) { 
     return true; 
    } else if (other instanceof States) { 
     States otherState = (States) other; 
     return (stateId == otherState.stateId); 
    } else { 
     return false; 
    } 
} 

hashCode:

@Override public int hashCode() { 
    StringBuilder b = new StringBuilder(stateId); 
    return b.toString().hashCode(); 
    } 

dies ist die Methode in findcommand Staaten:

public Commands findCommand(States state, char inputTapeChar, 
     char[] tapeChars) { 
    Commands searchDummy = new Commands(state, inputTapeChar, tapeChars, 
      null, null, null, null); 
    int pos = commands.indexOf(searchDummy); 
    return pos >= 0 ? commands.get(pos) : null; 
} 

Befehle sind meine Arraylist, also möchte ich die searchDummy mit indexOf() finden.

Ich habe die Klasse Commands, die das Attribut Konfigurationskonfiguration enthält, die Klasse Configuration, die die Attribute einer Konfiguration und das Attribut Übergangsübergang und den Klassenübergang enthält, der die Attribute für sich enthält.

Klasse Befehle:

public class Commands implements Comparable<Commands> { 

private Configuration configuration; 

Klassen-Konfiguration:

public class Configuration { 

private Transition transition; 
private States state; 
private char inputTapeChar; 
private char[] tapeChars; 

Klasse Transition:

public class Transition { 

private States targetState; 
private Direction inputTapeHeadMove; 
private char[] newTapeChars; 
private Direction[] tapeHeadMoves; 

Ich habe diese Methode in Befehle gleich:

@Override public boolean equals(Object other) { 
if (this == other) { 
return true; 
} else if (other instanceof Commands) { 
Commands otherCmd = (Commands) other; 
return (configuration.equals(otherCmd.configuration)); 
} else { 
return false; 
} 
} 

und diese hashcode

@Override 
    public int hashCode() { 
    StringBuilder b = new StringBuilder(configuration.getState() + "," 
    + configuration.getInputTapeChar()); 
    for (char c : configuration.getTapeChars()) { 
     b.append("," + c); 
    } 
    return b.toString().hashCode(); 
    } 

dann fast die gleiche Konfiguration:

@Override 
public boolean equals(Object other) { 
    if (this == other) { 
     return true; 
    } else if (other instanceof Configuration) { 
     Configuration otherConfi = (Configuration) other; 
     return (state.equals(otherConfi.state)) 
       && (inputTapeChar == otherConfi.inputTapeChar) 
       && (Arrays.equals(tapeChars, otherConfi.tapeChars)); 
    } else { 
     return false; 
    } 
} 

hashcode:

@Override 
public int hashCode() { 
    StringBuilder b = new StringBuilder(state + "," + inputTapeChar); 
    for (char c : tapeChars) { 
     b.append("," + c); 
    } 
    return b.toString().hashCode(); 
} 

equales in Klasse Zustand:

@Override 
public boolean equals(Object other) { 
    if (this == other) { 
     return true; 
    } else if (other instanceof States) { 
     States otherState = (States) other; 
     return (stateId == otherState.stateId); 
    } else { 
     return false; 
    } 
} 

so meine Frage: wenn ich das debuggen geht es durch, bis es mit den Überprüfungen fertig ist, aber wenn es den Wert zurückgeben sollte, klemmt es bei Configuration.equals (...) und zeigt den Fehler keine Quelle an!

Was ist das Problem? Sind die Hashcodes falsch? Oder sind die Gleichen falsch?

Ich habe noch nie gleich verwendet, also weiß ich nicht, wann ich es benutzen muss oder wie ich das beheben muss. danke für Ihre Hilfe.

+0

Ich habe nicht einmal die 'hashCode'-Implementierungen angeschaut, da es nicht so aussieht, als ob es in Ihrem Fall verwendet wird. Aber ja, Sie müssen definitiv das 'equals' für Ihre' States' Klasse definieren. Andernfalls führt 'state.equals (otherConfi.state)' standardmäßig eine Referenzgleichheit aus. Ich weiß nicht über diesen spezifischen Fehler, den Sie bekommen. – sstan

+1

Mögliches Duplikat von [Warum muss ich die Methoden equals und hashCode in Java überschreiben?] (Http://stackoverflow.com/questions/2265503/why-do-i-need-to-override-the-equals-and) -hashcode-methoden-in-java) – Lee

+0

@sstan Ich habe die Attribute von States und die equals- und hashcode-Methode darin bearbeitet. – Wosch

Antwort

0

Ihre hashCode Implementierung sieht verdächtig aus - alles, was String Zeug nicht Standard ist.

@Override 
public int hashCode() { 
    int result = 17; 
    result = 31 * result + targetState.hashCode(); 
    result = 31 * result + inputTapeHeadMove.hashCode(); 
    result = 31 * result + newTapeChars.hashCode(); 
    result = 31 * tapeHeadMoves.hashCode(); 
    return result; 
} 

Die meisten IDEs Autogen von hashCode und equals Methoden bieten:

Zum Beispiel für Ihre Transition-Klasse sollte wie folgt sein.