匿名添加对象时从ArrayList获取特定对象?

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)

代替...

最终,这将取决于你想要实现的目标......


Mak*_*oto 7

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)


Kar*_*k T 6

如果你想根据他们的String名字查找对象,这是a的教科书案例Map,例如a HashMap.您可以使用a LinkedHashMap并将其转换为a ListArray更高版本(Chris在下面的评论中已经很好地介绍了它).

LinkedHashMap因为它允许您按照插入顺序访问元素(如果要这样做).否则HashMapTreeMap将会.

你可以List像其他人建议的那样使用它,但这对我来说感觉很难......而且从短期和长期来看都会更清洁.

如果必须使用对象的列表,您仍然可以Map将对象名称存储到数组中的索引.这有点丑陋,但你得到的表现几乎和平原一样Map.

  • 特别是,您总是可以使用`map.values().toArray(new Party [0])`转储到数组中,并且可以使用`new ArrayList <Party>(map.values())`转储到一个列表. (2认同)