2017-02-09 4 views
1

Ich bekomme nicht die richtige Antwort, wenn ich versuche, indexOf() einer ArrayList zu verwenden, die aus benutzerdefinierten Objekten besteht. Hier ist der Code, der eines der Objekte erstellt:indexOf() für ArrayList von benutzerdefinierten Objekten funktioniert nicht

State kansas = new State("KS", 5570.81, 2000) 

Also, der Name des Objekts „Kansas“

Hier ist der Code, der die Arraylist erstellt und fügt das Objekt:

ArrayList<State> allStates = new ArrayList<State>();  
    allStates.add(kansas); 

Und hier ist der Code, den ich versuche, den Index dieses Objekt zu finden zu verwenden:

System.out.println(allStates.indexOf(kansas)); 

Dies ist Punkt, an dem mein Compiler (Eclipse) mir ein rotes X zeigt, das anzeigt, dass ein Problem mit meinem Code vorliegt und das Problem ist, dass es 'Kansas' nicht erkennt. Also habe ich das versucht:

String s = "kansas"; 
    System.out.println(allStates.indexOf(s)); 

und es wird ausgeführt, aber das Ergebnis ist -1.

Ich rufe eine Methode aus einer anderen Klasse auf, um die ArrayList zu erstellen, anstatt sie in derselben Klasse wie meine Hauptmethode zu erstellen, aber ich bin neu genug, um zu programmieren, dass ich nicht sicher bin, ob ich dort bin falsch gehen. Doch für das Programm, um die ich Arbeit schreibe, muss ich Daten über jeden der Staat Objekte gespeichert haben, so dass ich es aus dem Hauptverfahren

jede Beratung zugreifen können.?

* Dies ist mein erstes Mal eine Frage zu stellen und ich war mir nicht sicher, wie viel Detail zu gehen, also wenn ich relevante Informationen vermisse, lass es mich wissen :)

+1

'String' ist kein' State', werden Sie eine gewisse Art von Filterverfahren schreiben müssen, die über die 'list' laufen kann und vergleichen Sie die' State's Namen mit dem '' String' – MadProgrammer

Antwort

0

Dies liegt daran, String ist nicht Ihr benutzerdefiniertes Objekt State Typ. Ihre Array-Liste ist eine Liste aller "State" -Typen, weshalb dies -

String s = "kansas"; 
System.out.println(allStates.indexOf(s)); 

nicht funktioniert.

Sie können eine bequeme Methode verwenden, die durch die Liste iteriert und den Index zurückgibt.

private int getIndexOfState(String stateName) { 
    for(State stateObject : allStates) { 
    if(stateObject.getName().equals(stateName)) 
     return allStates.indexOf(stateObject); 
    } 
return -1; 
} 

Jetzt können Sie diese Methode erneut verwenden Index eines Staates Namen finden Sie weitergeben, und immer dann, wenn die Methode -1 zurückgibt, bedeutet dies den state (Staat) nicht in der Liste der states.You finden kann passieren in 'Kansas' oder 'California' oder irgendetwas als Parameter für die Methode.

In Ihrer Methode rufen Sie

System.out.println(getIndexOfState("Kansas"));  
    System.out.println(getIndexOfState("Chicago")); 
0

Der Rückgabewert ist -1 sagen, weil es keine String "Kansas" in allStates ist, und ArrayList#indexOfreturns -1 if the element is not present in the list. Wenn Sie versuchen, s zu hinzuzufügen, wird der Compiler Sie sogar nicht zulassen, da State kein String ist.

Ich weiß nicht, warum Sie einen String mit dem Wert „Kansas“ instanziiert, aber wenn man auf die State aus seinem Namen verweisen müssen (vielleicht der Name von einem Scanner Eingang kommt), werden Sie eine Map<String, State> benötigen, tun Sie

Map<String, State> map = new HashMap<>(); 
map.put("kansas", kansas) // a String and the object named kansas 

können dann: wie

System.out.println(allStates.indexOf(map.get("kansas"))) 
//or  
String s = "kansas"; 
System.out.println(allStates.indexOf(map.get(s))) 
1

Methode indexOf verwendet equlas() Methode Objekte zu vergleichen. Deshalb müssen Sie die equals-Methode in Ihrer benutzerdefinierten Klasse überschreiben (wenn Sie planen, die Klasse hapesCode auch in Map zu überschreiben). Die meisten IDE können diese Methoden generieren (equals und hashCode).
hier einfaches Beispiel.

public class State { 

    private String stateCode; 

    public State(String stateCode /* other parameters*/) { 
     this.stateCode = stateCode; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 

     if (o == null || getClass() != o.getClass()) return false; 

     State state = (State) o; 

     return stateCode.equals(state.stateCode); 
    } 

    @Override 
    public int hashCode() { 
     return stateCode.hashCode(); 
    } 
} 
+0

if (o == null || getClass()! = o.getClass()) return false; 'Dieses Bit bedeutet, dass ein String niemals gleich dem Objekt ist und somit den Zweck Ihrer Lösung vereitelt (wenn ich das richtig verstehe, Sie schlagen vor, dass "indexOf" eine Übereinstimmung für ein Objekt mit dem entsprechenden statecode ergibt. – MikaelF

+0

Ich habe die Frage missverstanden. Wenn Ziel suchen IndexOf Zustand in der List-Klasse muss überschreiben gleich() -Methode. Wenn Ziel Objekt suchen Status nach Status 'Code möglicherweise besser verwenden Zuordnung wo Schlüssel ist State'code und Wert ist State-Objekt – DanikX

Verwandte Themen