【问题标题】:Java arraylist indexofJava 数组列表索引
【发布时间】:2012-08-27 15:34:05
【问题描述】:

这是我的班级animals.java

public class animals {
    String Name, ID;
    static ArrayList<animals> animalData = new ArrayList<animals>();

    public animals(){}
    public animals(String name, String id){
        super();
        this.Name = name;
        this.ID = id;
    }

    public void addAnimal(String name, String id){
        animalData.add(new animals(name, id));
    }

    public int search(String name){
        return this.animalData.indexOf(name);
    }
}

当我添加一个带有 id 的动物名称时,它可以正常工作,但是当我使用搜索方法时,我只看到 -1。也许我在这个类中尝试覆盖方法equalsindexof?帮我解决这个问题

谢谢你,对不起我的英语不好..

【问题讨论】:

  • 是的,你需要重写equals方法。

标签: java arraylist indexing


【解决方案1】:

您正在将animals 的实例添加到列表中。您正在按名称搜索实例。由于animalData 不包含String 的任何实例,因此indexOf() 将永远不会返回索引。

如果您想通过名称访问animals 的实例,您应该使用Map&lt;String,animals&gt;

Map<String,animals> animalMap = new HashMap<String,animals>();
animalMap.put("Mat", new animals("Mat", "id");
animals animal = animalMap.get("Mat");

indexOf() 的正确用法是传入一个等于集合中已有实例的实例。正如其他人指出的那样,这将要求您定义 equals() 来定义使两个实例相等的原因。您还应该在覆盖 equals() 时覆盖 hashcode(),因为存在假定的相关性。

注意:惯例是使用大写字母作为类名。此外,类名不应该是复数。您将有许多 Animal 的实例,您可以稍后创建一个作为 Aniamals 集合的类,但它不应该是主类的名称。

【讨论】:

  • ty 但我想学习这个问题;静态 ArrayList animalData = new ArrayList();我可以添加新动物列表,例如:“CAT”、“1”; “DOG”,“2” ..这工作正常,我显示所有项目,但;当我想在animalData列表中搜索“CAT”时,我想获取“CAT”的索引。(因为我需要index,当我更改“CAT”>“BIRD”时)animalData .set( 索引,元素);我知道这种方法,但我需要“CAT”索引。这不可能?
  • @user1429570:您的意思是要根据您定义的ID 访问“CAT”吗?还是您想通过实例在列表中存在的索引来访问它? indexOf() 将为您提供列表中实例的索引。它不会在列表中搜索名称为“CAT”的实例,并返回您分配的 ID“1”;如果你想稍后做,你应该做一个字符串到字符串的映射,并使用 name 作为键和 id 作为值。
【解决方案2】:

是的,当您在集合中使用对象并执行基于对象的查找时,您需要覆盖equals()hashcode() 方法。

indexOf() 返回对象,因为它只返回该特定索引处的对象。但是,当您进行基于对象的查找时,如果 equals() 和 hashCode() 没有被覆盖,equals() 可能会失败并且您会得到不可预知的结果。

【讨论】:

  • 它不起作用是什么意思?你能用你的 equals() 和 hashcode() 方法更新问题吗?
  • @user1429570:查看此链接了解更多信息technofundo.com/tech/java/equalhash.html
  • 如果您遇到 equals/hashcode AND 使用 eclipse 的问题,请点击 Source -&gt; Generate hashCode() &amp; equals()
【解决方案3】:

你需要定义一个“equals”方法

【讨论】:

  • 仅仅拥有 equlas() 可能不是有效的哈希码/等于覆盖合约。
  • 当我定义 equals 方法时,它的默认代码我如何改变我不知道:s
  • 你可能想要一些类似 public boolean equals(Object b) { return ( id.equals(b)); }
【解决方案4】:

您正在寻找一个字符串... 我认为你最好使用 HashMap...

但是你必须改变你的结构(这不是很有效)

【讨论】:

  • HashMap 效率如何降低?
【解决方案5】:

这是我要使用的代码:

public class animals {
    String Name, ID;
    static Map<String, animals> animalData = new HashMap<String, animals>();

    public animals(){}
    public animals(String name, String id){
        super();
        this.Name = name;
        this.ID = id;
    }

    public static void addAnimal(String name, String id){
        animalData.add(new animals(name, id));
    }

    // Returns null if no registered animal has this name.
    public animals search(String name){
        return this.animalData.get(name);
    }
}

这样,您可以使 search 方法更快 (O(1)),您不再需要重写 equals 方法。

请注意,如果animalData 是静态的,您应该考虑将addAnimal() 也设为静态,因为它是aniamalData 的“设置器”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    相关资源
    最近更新 更多