【问题标题】:How to get the index of object by its property in Java list如何通过Java列表中的属性获取对象的索引
【发布时间】:2019-02-04 06:28:28
【问题描述】:

我想通过 Java 中的属性获取列表中对象的索引。
示例:

List<MyObj> list = new ArrayList<>();
list.add(new MyObj("Ram");
list.add(new MyObj("Girish");
list.add(new MyObj("Ajith");
list.add(new MyObj("Sai");  

public class MyObj {
public String name;
    public MyObj(String name){
        this.name=name;
    }
}

现在,我想获取包含名称为“Girish”的对象的索引。请让我知道 JAVA 中的代码。

【问题讨论】:

  • search in java ArrayList的可能重复
  • 为什么需要获取索引?
  • 好问题 MC。实际上,当更新来自服务器时,我想更新该特定对象。此处服务器将仅提供单个对象的更新。所以我必须在我的列表中搜索旧对象,我需要更新。最后,我需要一个列表中的所有这些对象来做一些分析

标签: java arraylist


【解决方案1】:

如果您想要使用流的解决方案,请使用以下解决方案:

int index = IntStream.range(0, list.size())
     .filter(i -> list.get(i).name.equals(searchName))
     .findFirst()
     .orElse(-1);

【讨论】:

  • .findFirst() 行中有一个错误放置的分号。
【解决方案2】:

如果您有List,您所能做的就是遍历每个元素并检查所需的属性。这是 O(n)

public static int getIndexOf(List<MyObj> list, String name) {
    int pos = 0;

    for(MyObj myObj : list) {
        if(name.equalsIgnoreCase(myObj.name))
            return pos;
        pos++;
    }

    return -1;
}

如果您想提高性能。然后你可以实现你自己的数据结构。 注意,关键特性是您的 key 属性应该是 HashMap 的键,HashMap 的值应该是索引。然后您将获得 O(1) 性能。

public static final class IndexList<E> extends AbstractList<E> {
    private final Map<Integer, E> indexObj = new HashMap<>();
    private final Map<String, Integer> keyIndex = new HashMap<>();
    private final Function<E, String> getKey;

    public IndexList(Function<E, String> getKey) {
        this.getKey = getKey;
    }

    public int getIndexByKey(String key) {
        return keyIndex.get(key);
    }

    @Override
    public int size() {
        return keyIndex.size();
    }

    @Override
    public boolean add(E e) {
        String key = getKey.apply(e);

        if (keyIndex.containsKey(key))
            throw new IllegalArgumentException("Key '" + key + "' duplication");

        int index = size();
        keyIndex.put(key, index);
        indexObj.put(index, e);
        return true;
    }

    @Override
    public E get(int index) {
        return indexObj.get(index);
    }
}

演示:

IndexList<MyObj> list = new IndexList<>(myObj -> myObj.name);
list.add(new MyObj("Ram"));
list.add(new MyObj("Girish"));
list.add(new MyObj("Ajith"));
list.add(new MyObj("Sai"));
System.out.println(list.getIndexByKey("Ajith"));    // 2

【讨论】:

  • @ScaryWombat 对不起,我的错。固定
  • 在 cmets OP 中说要返回 object 。你能换吗?
  • Now, I would like to the get the index of an Object which contains the name as "Girish" 真的吗?!
  • @manfromnowhere 有了索引后,获取对象就很简单了
【解决方案3】:

如果您更改 .equals 函数,indexOf() 将起作用

我建议只是迭代

int getIndex(String wanted){
  for(int i = 0; i<list.size(); i++){
    if(list.get(i).name.equals(wanted)){
      return i;
    }
  }
}

【讨论】:

  • 谢谢亚历山大。但是没有这个循环有什么办法吗?因为在我的情况下,可能有 5k+ 个对象。
  • 你也可以考虑使用Map &lt;String, MyObj&gt;
  • 我试过了,但最后我需要 List。如何从地图中获取列表?
  • @GirishSetti 您是否尝试过自己进行任何研究?这是微不足道的
  • 根据我的评论,地图将包含一个键(即名称)和MyObj 的值 - 没有List
【解决方案4】:

indexOf() 将返回一个值第一次出现的索引。例如:

int myIndex = list.indexOf("Ram")

(请注意,尽管您的数组列表不包含“Ram”,但它包含MyObj 类型的对象,其中name 为“Ram”)

记住 ArrayLists 从 0 开始,而不是从 1。

【讨论】:

    猜你喜欢
    • 2011-11-02
    • 2014-02-04
    • 2012-11-25
    • 1970-01-01
    • 2014-10-20
    • 2013-10-10
    • 2015-03-31
    • 2011-07-05
    • 2023-04-08
    相关资源
    最近更新 更多