lei*_*ero 10 java arraylist object
我已经创建了一个我的问题的简短例子.我正在匿名创建一个对象列表并将它们添加到一个ArrayList.一旦项目进入,ArrayList我稍后回来并向列表中的每个对象添加更多信息.如果你不知道它的索引,有没有办法从列表中提取特定对象?
我只知道对象的'名字',但你不能做list.get(ObjectName)任何事情.建议的方法是什么?每次我想要检索一个特定对象时,我宁愿不必遍历整个列表.
public class TestCode{
public static void main (String args []) {
Cave cave = new Cave();
// Loop adds several Parties to the cave's party list
cave.parties.add(new Party("FirstParty")); // all anonymously added
cave.parties.add(new Party("SecondParty"));
cave.parties.add(new Party("ThirdParty"));
// How do I go about setting the 'index' value of SecondParty for example?
}
}
class Cave {
ArrayList<Party> parties = new ArrayList<Party>();
}
class Party extends CaveElement{
int index;
public Party(String n){
name = n;
}
// getter and setter methods
public String toString () {
return name;
}
}
class CaveElement {
String name = "";
int index = 0;
public String toString () {
return name + "" + index;
}
}
Run Code Online (Sandbox Code Playgroud)
Mad*_*mer 13
鉴于使用List,没有迭代通过它就无法"查找"值...
例如...
Cave cave = new Cave();
// Loop adds several Parties to the cave's party list
cave.parties.add(new Party("FirstParty")); // all anonymously added
cave.parties.add(new Party("SecondParty"));
cave.parties.add(new Party("ThirdParty"));
for (Party p : cave.parties) {
if (p.name.equals("SecondParty") {
p.index = ...;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这需要时间.如果您要查找的元素位于列表的末尾,则必须在找到匹配项之前迭代到列表的末尾.
使用Map某种类型可能更好......
所以,如果我们更新Cave看起来像......
class Cave {
Map<String, Party> parties = new HashMap<String, Party>(25);
}
Run Code Online (Sandbox Code Playgroud)
我们可以做点像......
Cave cave = new Cave();
// Loop adds several Parties to the cave's party list
cave.parties.put("FirstParty", new Party("FirstParty")); // all anonymously added
cave.parties.put("SecondParty", new Party("SecondParty"));
cave.parties.put("ThirdParty", new Party("ThirdParty"));
if (cave.parties.containsKey("SecondParty")) {
cave.parties.get("SecondParty").index = ...
}
Run Code Online (Sandbox Code Playgroud)
代替...
最终,这将取决于你想要实现的目标......
List.indexOf()如果您确切地知道自己想要的是什么,并且方法是明确定义的,那么它将为您提供您想要的东西.equals()Party
Party searchCandidate = new Party("FirstParty");
int index = cave.parties.indexOf(searchCandidate);
Run Code Online (Sandbox Code Playgroud)
这是它变得有趣的地方 - 子类不应该检查它们的父类的私有属性,所以我们将equals()在超类中定义.
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof CaveElement)) {
return false;
}
CaveElement that = (CaveElement) o;
if (index != that.index) {
return false;
}
if (name != null ? !name.equals(that.name) : that.name != null) {
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
hashCode如果你覆盖,那么覆盖是明智的equals- 强制性的一般契约hashCode,如果x.equals(y),然后是x.hashCode()== y.hashCode().
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + index;
return result;
}
Run Code Online (Sandbox Code Playgroud)
如果你想根据他们的String名字查找对象,这是a的教科书案例Map,例如a HashMap.您可以使用a LinkedHashMap并将其转换为a List或Array更高版本(Chris在下面的评论中已经很好地介绍了它).
LinkedHashMap因为它允许您按照插入顺序访问元素(如果要这样做).否则HashMap或TreeMap将会.
你可以List像其他人建议的那样使用它,但这对我来说感觉很难......而且从短期和长期来看都会更清洁.
如果必须使用对象的列表,您仍然可以Map将对象名称存储到数组中的索引.这有点丑陋,但你得到的表现几乎和平原一样Map.