当我尝试使用由用户定义的对象组成的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方法访问它。
有什么建议吗?
*这是我第一次发帖提问,我不确定要详细说明,如果我错过了相关信息,请告诉我们:)
答案 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,因为String
和allStates
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