我想通过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中的代码。
答案 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)
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开始而不是一个。