indexOf()用于未运行的用户定义对象的ArrayList

时间:2017-02-09 03:36:41

标签: java eclipse object arraylist

当我尝试使用由用户定义的对象组成的ArrayList的indexOf()时,我没有得到正确的答案。以下是创建其中一个对象的代码:

    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的点,表明我的代码存在问题,问题是它无法识别堪萨斯州#39;。所以我尝试了这个:

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

它将运行但结果为-1。

我从另一个类调用一个方法来创建ArrayList,而不是在与我的main方法相同的类中创建它,但是我已经足够新编码了我不能确定是否是哪里出错了但是,为了使我正在编写的程序工作,我需要有关于存储的每个State对象的数据,以便我可以从main方法访问它。

有什么建议吗?

*这是我第一次发帖提问,我不确定要详细说明,如果我错过了相关信息,请告诉我们:)

3 个答案:

答案 0 :(得分:1)

这是因为,String不是您的自定义对象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(state)。你可以传入'堪萨斯'或'加利福尼亚'或任何作为方法参数的东西。

在您的方法通话中,您说

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

答案 1 :(得分:1)

方法indexOf使用equlas()方法来比较对象。 这就是为什么你必须在自定义类中重写equals方法(如果你计划在Map中使用类覆盖hashCode方法)。 大多数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();
    }
}

答案 2 :(得分:0)

返回值为-1,因为StringallStates returns -1 if the element is not present in the list中没有ArrayList#indexOf“堪萨斯”。如果您尝试将s添加到allStates,编译器甚至不会允许您,因为State不是String

我不知道为什么你用值“堪萨斯”实例​​化String,但如果你需要从名字中引用State(也许这个名字来自{{1}输入),您需要Scanner,例如:

Map<String, State>

然后,你可以这样做:

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