在arraylist中编辑元素,找到索引?

时间:2014-01-30 17:26:22

标签: java arraylist

我即将创建两种创建和更改客户档案的方法。创建配置文件没问题。一切似乎都很顺利。但是,当我进入并更改配置文件时,我认为它不起作用。

indexOf()给出-1,即使我搜索的值为:S

任何人都有一个很好的解决方案吗?

问题在于editProfile方法!

public class Profile{
    String name;
    long id;
    int accNr = 1000;
    double balance;
}

ArrayList<Profile> profileList = new ArrayList<Profile>();

public boolean newProfile(long id, String name, int amount){
    Profile newProfile = new Profile();
    Profile accNr = new Profile();

    int ACC = accNr.accNr++;

    newProfile.accNr = ACC;
    newProfile.id = id;
    newProfile.name = name;
    newProfile.balance = amount;

    profileList.add(newProfile);

    return true;
}

public void editProfile(long id, String newName){
    int ID = (int)id;
    System.out.print(ID);
    int index = profileList.indexOf(id);
    System.out.print(index);

    profileList.get(index);
}

3 个答案:

答案 0 :(得分:1)

indexOf方法将使用equals方法确定列表中是否存在Profile。您必须覆盖Profile中的equals method才能返回正确的结果。

其次,它找不到您的Profile,因为您将long传递给indexOf,而longLong都不会在列表中找到。如果您必须通过Profile检索long,那么拥有Map<Long, Profile>代替ArrayList<Profile>会更有意义。然后,您可以致电get(id)来检索Profile。通常,如果您覆盖equals,则应覆盖hashCode method,但由于此处未将Profile用作关键字,因此不需要。

答案 1 :(得分:0)

profileList包含Profile个实例,您正在尝试获取long的索引。

  • 一个解决方案是覆盖equals类中的Profile方法。
  • @Override
    public boolean equals(Object obj) {
        ...
    }
    

  • 另一个解决方案(不太推荐)将循环遍历profileList的元素并手动检查匹配项,例如:
  • for (Profile element : profileList)
        if (element.getID() == id)
            ...
    

    答案 2 :(得分:0)

    可能你的Profile需要覆盖equals和hashCode方法。 Eclipse可以生成然后,就像举个例子:

    public class Profile {
    String name;
    long id;
    int accNr = 1000;
    double balance; 
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + accNr;
        long temp;
        temp = Double.doubleToLongBits(balance);
        result = prime * result + (int) (temp ^ (temp >>> 32));
        result = prime * result + (int) (id ^ (id >>> 32));
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Profile other = (Profile) obj;
        if (accNr != other.accNr)
            return false;
        if (Double.doubleToLongBits(balance) != Double
                .doubleToLongBits(other.balance))
            return false;
        if (id != other.id)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    

    }