当前位置: 首页 > 知识库问答 >
问题:

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

萧自珍
2023-03-14

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

共有3个答案

巩选
2023-03-14

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

我建议直接迭代

int getIndex(String wanted){
  for(int i = 0; i<list.size(); i++){
    if(list.get(i).name.equals(wanted)){
      return i;
    }
  }
}
仲绍晖
2023-03-14

如果您有一个< code>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

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

蓝夕
2023-03-14

如果您想要一个带有流的解决方案,请使用此解决方案:

int index = IntStream.range(0, list.size())
     .filter(i -> list.get(i).name.equals(searchName))
     .findFirst()
     .orElse(-1);
 类似资料:
  • 问题内容: 例如,我有: 然后,例如,我要通过对该对象进行 排序/反转。然后我想得到这样的东西: 现在,我想知道具有属性的对象的索引,以获取属性标记的值。 我该如何解决这个问题? 问题答案: 正如其他答案所暗示的那样,遍历数组可能是最好的方法。但是我会把它放在它自己的函数中,并使它更抽象一些: 这样,您不仅可以找到包含“ John”的一个,而且可以找到包含令牌“ 312312”的一个: 编辑: 未

  • 问题内容: 当存在时,是否有可能获得全部列表?是否为此准备了电话,还是我必须编写一个foreach循环,如: 问题答案: Java 8及更高版本: 如果需要确保得到结果,则必须将最后一行更改为: Java 7及以下版本: Java 8之前的标准集合API不支持这种转换。您必须编写一个循环(或将其包装在您自己的“地图”函数中),除非您使用一些更高级的集合API /扩展。 (您的Java代码段中的行正

  • 在 PowerShell 中,如何通过指定对象的名称(字符串)来获取对象的属性值?我想要类似这样的东西: 是否有类似于“获取属性名称”的内容?

  • 问题内容: 假设此JSON对象: 可以像这样检索“ set2”属性: 有没有一种方法可以通过索引检索“ set2”属性?它是JSON对象的第二个属性。这是行不通的(当然): 因此,假设我要检索JSON对象的第二个属性,但我不知道它的名称-那么我该怎么做? 更新: 是的,我知道对象是无序属性的集合。但是我不认为浏览器会干扰JSON文字/字符串定义的“原始”顺序。 问题答案: JavaScript中的

  • 我正在尝试过滤scala中对象列表的列表属性。例如: 用java定义的类 我的过滤器函数返回字符串列表而不是结果列表 UPDATE我想取回listOf中的所有结果,其中每个结果的名称属性被过滤。

  • 问题内容: 和骗局。如何按升序排序,然后按?有人可以帮忙吗?我知道在中具有通用算法和重载运算符,但是我是Java新手。 问题答案: 使实现或在单独的类中实现。然后致电: 要么 通常,如果有一个单一的“自然”排序顺序,则实施是个好主意…否则(如果你碰巧想要按特定顺序进行排序,但可能同样容易地希望使用另一个顺序),则最好实现。老实说,这种特殊情况可能会发生任何一种……但是我可能会坚持使用更灵活的选择。