2017-02-09 2 views
1

Я не получаю правильный ответ, когда пытаюсь использовать indexOf() из ArrayList, состоящего из определенных пользователем объектов. Вот код, который создает один из объектов:indexOf() для ArrayList из объектов, не определенных пользователем

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

Таким образом, имя объекта «канзас»

Вот код, который создает ArrayList и добавляет объект:

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

А вот код, который я пытаюсь использовать, чтобы найти индекс этого объекта:

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

Это точка, в которой мой компилятор (Eclipse) бросает мне красный X, указывающий на наличие проблемы с моим кодом, и проблема в том, что он не распознает «kansas». Поэтому я пробовал это:

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

и он будет работать, но результат будет равен -1.

Я вызываю метод из другого класса, чтобы создать ArrayList, а не создавать его в том же классе, что и мой основной метод, но я достаточно новичок в кодировании, что я не уверен, что это где я идет не так. Тем не менее, для того, чтобы программы, которые я пишу на работе, мне нужно иметь данные о каждом из государственных объектов, хранимых таким образом, что я могу получить доступ из главного метода.

Любые советы?

* Это мой первый вопрос, когда я задавал вопросы, и я не был уверен, как много деталей, чтобы уйти, поэтому, если мне не хватает соответствующей информации, пожалуйста, дайте мне знать :)

+1

'String' не' State', вам придется написать какой-то метод фильтрации, который может выполнять итерацию по 'list' и сравнить' имя State's с '' String' – MadProgrammer

ответ

0

Это потому, что String не является вашим обычным объектом State. Список ваших массивов - это список всех типов «State», поэтому это -

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

не будет работать.

Что вы можете сделать, это метод удобства, который выполняет итерацию по списку и возвращает индекс.

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

Теперь вы можете использовать этот метод, чтобы найти индекс любого состояния имени вы передаете, и всякий раз, когда метод возвращает -1, это означает StateName (состояние) не найден в списке States.You может пройти в «Канзасе» или «Калифорнии» или что-то в качестве параметра метода.

В вашем вызове метода вы говорите

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

Возвращаемое значение -1, потому что нет String «канзас» в allStates и ArrayList#indexOfreturns -1 if the element is not present in the list. Если вы попытаетесь добавить s в allStates, компилятор даже не позволит вам, потому что State не является String.

Я не знаю, почему вы инстанцирован в String со значением «Канзас», но если вам нужно обратиться к State от его имени (возможно, название происходит от Scanner входа), вы будете нуждаться в Map<String, State>, таких как:

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

Затем вы можете сделать:

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

метод indexOf использует equlas() метод для сравнения объектов. Вот почему вы должны переопределить метод equals в своем пользовательском классе (если вы планируете использовать класс в Map override hashCode method). Большинство IDE могут генерировать эти методы (equals и hashCode).
здесь простой пример.

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()) возвращает false; этот бит означает, что строка никогда не будет равна объекту, следовательно, побеждая цель вашего решения (если я правильно понимаю, вы предлагаете, чтобы 'indexOf' давал совпадение для объекта с соответствующим кодом состояния). – MikaelF

+0

Я неправильно понял вопрос. если цель find indexOf состояние в классе списка должно переопределить метод equals(). , если объект поиска цели. State by state'code, возможно, лучше использовать. Карта, где ключ - код состояния, а значение - объект состояния. – DanikX