获取Java列表中的对象索引

时间:2011-02-27 05:15:29

标签: java android list indexing

我的(Android)Java程序中有一个字符串列表,我需要获取列表中对象的索引。问题是,我只能找到有关如何查找对象的第一个和最后一个索引的文档。如果我的列表中有3个或更多相同的对象怎么办?如何找到每个索引?

谢谢!

3 个答案:

答案 0 :(得分:6)

你需要进行暴力搜索:

  static <T> List<Integer> indexesOf(List<T> source, T target)
  {
     final List<Integer> indexes = new ArrayList<Integer>();
     for (int i = 0; i < source.size(); i++) {
       if (source.get(i).equals(target)) { indexes.add(i); }
     }
     return indexes;
  } 

请注意,这不一定是最有效的方法。根据上下文和列表的类型/大小,您可能需要进行一些严格的优化。关键是,如果您需要每个索引(并且对列表内容的结构一无所知),那么您需要在每个项目中进行死亡,以获得最佳O(n)成本。

根据基础列表的类型,get(i)可能是O(1)(ArrayList)或O(n)(LinkedList),因此这可能会导致O(n 2 )实施。您可以复制到ArrayList,也可以手动LinkedList递增索引计数器。

答案 1 :(得分:2)

如果文档在我的逻辑中没有帮助我在这种情况下我会采用原始​​方法在循环中遍历列表并保存我找到匹配的索引

 ArrayList<String> obj = new ArrayList<String>();


 obj.add("Test Data"):  // fill the list with your data

 String dataToFind = "Hello";

 ArrayList<Integer> intArray = new ArrayList<Integer>();

 for(int i = 0 ; i<obj.size() ; i++)
 {
    if(obj.get(i).equals(dataToFind)) intArray.add(i);     
 } 

 now intArray would have contained all the index of matched element in the list

答案 2 :(得分:1)

另一种强力方法,它也可以找到所有null索引:

static List<Integer> indexesOf(List<?> list, Object target) {
    final List<Integer> indexes = new ArrayList<Integer>();
    int offset = 0;
    for (int i = list.indexOf(target); i != -1; i = list.indexOf(target)) {
        indexes.add(i + offset);
        list = list.subList(i + 1, list.size());
        offset += i + 1;
    }
    return indexes;
}