如何在Java列表中通过对象的属性获取索引

时间:2019-02-04 06:28:29

标签: java arraylist

我想通过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中的代码。

5 个答案:

答案 0 :(得分:5)

如果要使用流解决方案,请使用以下方法:

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

答案 1 :(得分: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;
}

如果您想提高性能。然后,您可以实现自己的数据结构。 请注意,该键的主要功能是您的键属性应为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

答案 2 :(得分:1)

如果您更改.equals函数,

indexOf()将起作用

我建议只是反复浏览

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

答案 3 :(得分:-1)

覆盖等于和哈希码以完成工作并使用

list.indexOf(new MyObj("Ajith")) // will return the index of an object.

答案 4 :(得分:-2)

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

int myIndex = list.indexOf("Ram")

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

请记住,ArrayList从0开始而不是一个。