【问题标题】:Get objects' index in a Java List在 Java 列表中获取对象的索引
【发布时间】:2011-07-05 03:12:48
【问题描述】:

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

谢谢!

【问题讨论】:

  • 怎么样:yourList.indefOf(yourObjectInList);我正在使用 java.util.ArrayList 和方法 indexOf(..) 工作得很好

标签: java android list indexing


【解决方案1】:

你需要进行蛮力搜索:

  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,手动增加索引计数器。

【讨论】:

  • 如何优化?我的清单大约有 8,000 项。此代码将在线程中运行,但我仍然不想永远显示“请稍候...”对话框。
  • 1) 在你有一个性能目标并且可以衡量之前不要优化; 2)如果你有一个ArrayList,上面应该可以正常工作; 3)如果没有,建议您改用ArrayList 或按照我上面的建议进行调整...
  • 如果需要每个匹配元素的索引,则必须检查列表中的每个元素。另一种方式可能是什么
  • 另外,也许您需要将此列表维护为排序/有序列表,在这种情况下,更有效的解决方案会容易得多。详细说明您的应用程序 - 这是什么列表?
  • 酷,谢谢大家。我会试一试,看看效果如何!
【解决方案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

【讨论】:

  • 如果列表的大小很大,那么这将需要优化才能应用。否则对于小尺寸列表,这不会造成问题
【解决方案3】:

另一种蛮力方法也可以找到所有 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;
}

【讨论】:

    猜你喜欢
    • 2012-11-25
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多