3 回答
TA贡献1856条经验 获得超11个赞
如果您想要一个带有流的解决方案,请使用这个:
int index = IntStream.range(0, list.size()) .filter(i -> list.get(i).name.equals(searchName)) .findFirst() .orElse(-1);
TA贡献1810条经验 获得超4个赞
如果您有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 属性应该是 a 的 key,HashMap而 valueHashMap应该是 index。然后你会得到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
TA贡献2065条经验 获得超14个赞
如果您更改 .equals 函数,indexOf() 将起作用
我建议只是迭代
int getIndex(String wanted){
for(int i = 0; i<list.size(); i++){
if(list.get(i).name.equals(wanted)){
return i;
}
}
}
添加回答
举报