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

2022-09-04 06:23:45

我为我的问题创建了一个简短示例。我正在匿名创建对象列表并将它们添加到.一旦项目在“我稍后返回”中,并向列表中的每个对象添加更多信息。如果您不知道特定对象的索引,有没有办法从列表中提取该对象?ArrayListArrayList

我只知道对象的“名称”,但你不能做任何事情。处理此问题的建议方法是什么?我宁愿不必在每次想要检索一个特定对象时都循环访问整个列表。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;
    }
}

答案 1

鉴于 的使用,没有办法在不迭代值的情况下“查找”它...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;
    }
}

现在,这需要时间。如果要查找的元素位于列表的末尾,则必须在找到匹配项之前循环访问列表的末尾。

最好使用某种...Map

因此,如果我们更新为...Cave

class Cave {
    Map<String, Party> parties = new HashMap<String, Party>(25);
}

我们可以做这样的事情...

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 = ...
}

相反。。。

最终,这完全取决于您想要实现的目标...


答案 2

List.indexOf() 会给你你想要的东西,只要你确切地知道你想要什么,并且 Partyequals() 方法定义得很好。

Party searchCandidate = new Party("FirstParty");
int index = cave.parties.indexOf(searchCandidate);

这就是它变得有趣的地方 - 子类不应该检查其父级的私有属性,因此我们将在超类中定义。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;
}

如果您覆盖覆盖,那么覆盖也是明智的 - 如果,则x.hashCode() == y.hashCode()的强制总协定。hashCodeequalshashCodex.equals(y)

@Override
public int hashCode() {
    int result = name != null ? name.hashCode() : 0;
    result = 31 * result + index;
    return result;
}