2017-02-09 118 views
1

当我尝试使用由用户定义的对象组成的ArrayList的indexOf()时,我没有得到正确的答案。下面是创建的对象之一代码:indexOf()for ArrayList of user defined objects not working

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,表示我的代码有问题,问题是它不识别'堪萨斯'。所以我试过这个:

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

它会运行,但结果是-1。

我打电话给一个来自不同类的方法来创建ArrayList,而不是在与我的主要方法相同的类中创建它,但我足够新来编码,我不确定这是我的位置去错了。但是,为了为我写工作计划,我需要有关于每个存储,这样我可以从主方法来访问它的国家目标的数据。

有什么建议?

*这是我第一次发布问题,我不确定要进入多少细节,所以如果我错过了相关信息,请让我知道:)

+1

'String'不是'State',你将不得不写某种滤波方法可以遍历'List'并与'String' – MadProgrammer

回答

0

这是因为,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的(状态)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方法中使用类)。大多数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

'比较'State's名如果(o == null || getClass()!= o.getClass())返回false;'这一点意味着一个字符串永远不会等于该对象,因此破坏了您的解决方案的目的(如果我理解正确,你建议'indexOf'给出一个与对应的状态码相匹配的对象)。 – MikaelF

+0

我误解了这个问题。 如果在list类中查找indexOf状态必须重写equals()方法。 如果目标通过状态码查找对象状态可能更好使用映射,其中键是状态码,值是状态对象 – DanikX