使用一个属性在自定义列表中查找对象的indexOf方法

7

我有一个自定义类和一个该类类型的数组列表。现在,我想仅使用可用于我身上的其他属性中的一个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

我将在列表中拥有与某个对象ID相等的MyClass对象的indexOf。


1
你能否创建一个方法,使用以下代码:list.stream().filter(myClass -> myClass.getID().equals(someObjectsID)) 以返回 MyClass 类型,并调用结果的 list.indexOf() 方法? - SupaJord
那肯定可以运行,但是我不是必须要重写hashCode()和equals()吗?因为使用自定义对象列表的indexOf似乎是这样的惯例。此外,这个两步过程会不会在更长的列表中导致延迟? - Sapta lyksmusic
很难。您确实需要两次遍历列表。但除非您正在处理Google Code Jam问题,否则我不认为您会注意到任何时间复杂度的差异。 - SupaJord
1
可能是Java List.contains(Object with field value equal to x)的重复问题。 - SupaJord
1
如果搜索关键字在对象本身中,那么在任何数组或列表中获取对象的索引都需要遍历。您必须遍历每个对象,并将搜索关键字与对象字段匹配,并返回找到它的对象的索引。为了避免在较长的列表中出现滞后,您需要通过使用HashMap或HashTable将字符串ID映射到索引来进行一些索引,这反过来又需要您重写MyClass的hashCode和equal方法。 - Syed Ahmed Jamil
显示剩余2条评论
3个回答

1

这个问题有一个绝对保证的高效解决方案。没有其他方法可以像这样简单和高效地工作。

那个解决方案就是编写循环而不尝试变得花哨。

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

不需要操心hashCode或equals。不需要强制将索引插入到不为其设计的流中。


针对“不需要涉及流”这一观点,我持不同意见。在流上使用.filter()来过滤给定字段是一个非常好的使用案例。 - SupaJord
@SupaJord,如果您需要原始列表中的索引(似乎OP需要),则不可以这样做。 - Louis Wasserman

1

如果你愿意使用第三方库,你可以使用detectIndexEclipse Collections中获取。

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 的提交者。

1
感谢您的回答@DonaldRaab。我可能不会使用第三方库,但这绝对是一个非常有用的工具,因为它非常简单易用。 - Sapta lyksmusic

-1

在您的自定义对象中覆盖hashCode和equals,然后indexOf就会正常工作(商标)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接