【问题标题】:Find indexOf of an object in custom list using one attribute使用一个属性在自定义列表中查找对象的 indexOf
【发布时间】:2019-06-28 17:07:09
【问题描述】:

所以,我有一个自定义类和该类类型的数组列表。现在,我想仅使用构成该类对象的其他属性中可用的 ID 来检索此数组列表中对象的索引。

在网上看到了一些例子,但我有点困惑,它们覆盖了 hashCode() 和 equals(),并且在 equals() 中它们检查了所有属性,我只想检查 ID 值,因为每个对象的 ID 都是唯一的。

public class MyClass {
    private String ID;
    private String name;
    private String userName;
    private String position;

    // Constructors and getters and setters
}

所以,我想要的是,比如说这段代码:

List<MyClass> list=new ArrayList<>();
//Values are populated into list
int i=list.indexOf(someObjectsID); //Where someObjectsID is a String and not a MyClass object

int 我将在列表中拥有 ID 等于 someObjectsID 的 MyClass 对象的 indexOf

【问题讨论】:

  • 你能不能只创建一个方法:list.stream().filter(myClass -> myClass.getID().equals(someObjectsID)) 返回MyClass,然后调用list.indexOf()结果呢?
  • 那肯定行得通,但话又说回来,我不必重写 hashCode() 和 equals() ,因为这似乎是使用 indexOf 和自定义对象列表的规范吗?另外,这两个步骤不会导致更长的列表滞后吗?
  • 几乎没有。您确实需要进行两次列表遍历。但除非你在做 Google Code Jam 问题,否则我认为你不会注意到任何时间复杂度差异。
  • 当搜索键在对象本身内部时,如果不遍历,就无法在任何数组或列表中获取对象的索引。您必须遍历每个对象并将搜索键与对象字段匹配并返回找到它的对象的索引。为了避免较长列表中的滞后,您必须通过使用 HashMap 或 HashTable 将您的字符串 ID 与索引映射来做一些索引,这反过来又需要您为 MyClass 覆盖 hashCode 和 equal 方法

标签: java android arraylist custom-lists


【解决方案1】:

如果您愿意使用第三方库,您可以使用来自Eclipse CollectionsdetectIndex

int index = ListIterate.detectIndex(list, each -> each.getID().equals(someObjectsID));

如果列表是MutableList 类型,则detectIndex 方法可以直接在列表中使用。

MutableList<MyClass> list = Lists.mutable.empty();
int index = list.detectIndex(each -> each.getID().equals(someObjectsID));

注意:我是 Eclipse Collections 的提交者

【讨论】:

  • 感谢您的回答@DonaldRaab 我可能不会使用第三方库,但这绝对是一个非常有用的工具,因为它非常简单易用。
【解决方案2】:

对于这个问题,有一个绝对有保证的、有效的解决方案。没有其他东西能如此简单或高效地工作。

那个解决方案是只写循环而不是想花哨。

for(int i = 0; i < list.size(); i++){
  if (list.get(i).getId().equals(id)) {
    return i;
  }
}
return -1;

无需乱用 hashCode 或 equals。无需将索引强制放入不是为它们设计的流中。

【讨论】:

  • 不同意“不需要进入流”,在给定字段的流上使用 .filter() 是一个很好的用例。
  • @SupaJord 如果您需要原始列表中的索引,则不需要,它看起来像 OP 一样。
【解决方案3】:

在您的自定义对象中覆盖 hashCode & equals,然后 indexOf 将正常工作 (tm)。

【讨论】:

    猜你喜欢
    • 2016-11-07
    • 2020-06-14
    • 1970-01-01
    • 2016-04-03
    • 2021-03-30
    • 2020-06-09
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多