【问题标题】:indexOf() in Android when using Helper使用 Helper 时 Android 中的 indexOf()
【发布时间】:2019-07-08 19:59:52
【问题描述】:

我知道下面的代码给出了 java 中那个特定元素的索引。

List<String> list = new ArrayList<>();

list .add("100");

Log.d("TAG",String.valueOf(list.indexOf("300")));

但是如何在使用辅助类时获取元素的索引呢?

List<HelperClass> Arraylist= new ArrayList<>();

Arraylist.add(new HelperClass(name, email, phoneno));

Log.d("TAG", String.valueOf(new HelperClass(Arraylist.indexOf(name,email,phoneno))));

我到处搜索,但找不到。有人可以告诉我如何在使用模态添加数据时在arraylist中找到特定项目的索引吗?

显然我尝试的是错误的,它在整行下方显示红线,但我只是输入了该代码,以便您了解我想要实现的目标。有人可以给我一个方法吗?

助手

 @Override
public int hashCode() {
    int result = getName() != null ? getName().hashCode() : 0;
    result = 31 * result + (Email != null ? Emaail.hashCode() : 0);
    result = 31 * result + (PhoneNo!= null ? PhoneNo.hashCode() : 0);

    return result;
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Helper)) return false;

    Helperthat = (Helper) o;

    if (getName() != null ? !getName().equals(that.getName()) : that.getName() != null)
        return false;
    if (Email != null ? !Email.equals(that.Email) : that.Email != null)
        return false;
    if (PhoneNo != null ? !PhoneNo.equals(that.PhoneNo) : that.PhoneNo != null)
        return false;

}

【问题讨论】:

    标签: java android android-studio arraylist indexing


    【解决方案1】:

    ArrayList#indexOf 使用Object#equals 比较方法。

    如果您希望能够在Collection 中查找HelperClass 实例,您需要提供自己的、被覆盖的equals 方法,还可能还需要提供hashCode 方法,以便与其他方法一起使用,具体的,Collection 实现(MapSet 等)。

    class HelperClass {
       ...
    
       @Override
       public boolean equals(final Object object) {
          if (object == this) {
            return true;
          }
    
          if (!(object instance of HelperClass)) {
             return false;
          }
    
          final HelperClass other = (HelperClass) object;
          return name.equals(other.name) &&
                 email.equals(other.email) &&
                 phone.equals(other.phone);
       }
    }
    

    您显然需要有一个合适的HelperClass 实例才能找到匹配项。

    final String name = "Name";
    final String email = "Email";
    final String phone = "Phone";
    
    final HelperClass first = new HelperClass(name, email, phone);
    final HelperClass second = new HelperClass(name, email, phone);
    
    final List<HelperClass> helpers = new ArrayList<>(8);
    helpers.add(first);
    
    final int index = helpers.indexOf(second); // index = 0
    

    【讨论】:

    • 你需要2个类实例吗?
    • @MaiseeMiller 好吧,如果您有权访问“第一个”实例,则可以使用那个。
    • @MaiseeMiller 我会为你做的。
    • 我自动生成了 equals 和 hashcode 代码,但我没有改变...有问题吗?因为我什至无法正确编译 indexOf 的代码
    • @MaiseeMiller 如果你已经自动生成了你的等号和哈希码,它必须工作。如果没有,请在此处发布您正在使用的代码。
    【解决方案2】:

    indexOf 需要对象作为输入。如果它没有找到你传入的对象,它将返回-1。您需要将要查找的数组列表中的位置作为输入传递给 indexOf 函数。

    解决方案: 创建一个 HelperClass 传递给 indexOf 方法:

    .indexOf(new HelperClass(name, email, phoneno));
    

    但是,该更改本身仍将返回 -1。请参阅 indexOf 的 api 文档:

    public int indexOf(Object o)

    返回指定元素第一次出现的索引 此列表,如果此列表不包含该元素,则为 -1。更多的 形式上,返回最低索引 i 使得 (o==null ? get(i)==null : o.equals(get(i))),如果没有这样的索引,则为 -1。

    它使用 equals 来决定是否找到匹配项。你应该重写 HelperClass 类的 equals 方法,所以它使用 java.lang.Object 中的默认实现,它比较引用,并且仅当两个 HelperClass 引用到同一个对象时才返回 true。

    覆盖 HelperClass 类上的等号和哈希码,例如:

    @Override public boolean equals(Object other) {
        if (!(other instanceof HelperClass)) {
            return false;
        }
        HelperClass otherHelperClass = (HelperClass)other;
        return otherHelperClass.x == this.x && otherHelperClass.y == this.y;
    }
    
    @Override public int hashCode() {
        return x + y; // same values should hash to the same number
    }
    

    【讨论】:

    • 它仍然显示-1。知道为什么吗?我用了“name.indexOf(new HelperClass(name, email, phoneno));”
    • 然后它要求我用 String.valueOf 包围它,所以我的最终代码是 "name.indexOf(String.valueOf(new HelperClass(name, email, phoneno, from)));跨度>
    • 我很抱歉,我还没有完成,我没有注意到我已经发布了答案。现在检查一下,我向你保证它会起作用(我遇到了同样的问题)
    • 如果我把 name.indexOf(new HelperClass(name, email, phoneno));它要求我使用 string.valueOf 进行包装,并且我已经在帮助程序类中生成了哈希码和 equals
    • 查看已编辑的问题。我添加了助手类
    猜你喜欢
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    相关资源
    最近更新 更多