Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取对象';Java列表中的索引_Java_Android_List_Indexing - Fatal编程技术网

获取对象';Java列表中的索引

获取对象';Java列表中的索引,java,android,list,indexing,Java,Android,List,Indexing,我的(Android)Java程序中有一个字符串列表,我需要获取列表中某个对象的索引。问题是,我只能找到关于如何查找对象的第一个和最后一个索引的文档。如果我的列表中有3个或更多相同的对象,该怎么办?如何找到每个索引 谢谢 您需要进行暴力搜索: static <T> List<Integer> indexesOf(List<T> source, T target) { final List<Integer> indexes = ne

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


谢谢

您需要进行暴力搜索:

  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;
  } 
静态列表索引(列表源,T目标)
{
最终列表索引=新的ArrayList();
对于(int i=0;i
请注意,这不一定是最有效的方法。根据上下文和列表的类型/大小,您可能需要进行一些认真的优化。关键是,如果您需要每个索引(并且对列表内容的结构一无所知),那么您需要对每个项目进行死搜索,最好是O(n)成本


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

如果文档在这种情况下对我的逻辑没有帮助,我会选择一种原始方法,在循环中遍历列表,并在找到匹配项的地方保存索引

 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
arraylistobj=newarraylist();
添加(“测试数据”)://用数据填充列表
字符串dataToFind=“Hello”;
ArrayList intArray=新的ArrayList();

对于(int i=0;i另一种蛮力方法,该方法还将查找所有
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;
}
静态列表索引(列表、对象目标){
最终列表索引=新的ArrayList();
整数偏移=0;
for(int i=list.indexOf(目标);i!=-1;i=list.indexOf(目标)){
索引。添加(i+偏移量);
list=list.subList(i+1,list.size());
偏移量+=i+1;
}
收益指标;
}

如果列表的大小很大,则需要进行优化。否则,对于较小的列表,这不会产生问题。我如何优化?我的列表大约有8000个项目。此代码将在线程中运行,但我仍然不想永远显示“请等待…”对话框。1)在有性能目标并可以衡量之前,不要进行优化;2) 如果您有一个
ArrayList
,上述操作应该可以正常工作;3) 如果没有,建议您切换到使用
ArrayList
,或者按照我上面的建议进行调整……如果需要每个匹配元素的索引,则必须检查列表中的每个元素。另一种方法是什么?或者,您可能需要将此列表维护为排序/有序列表,在这种情况下,更有效的解决方案会更容易一些。多说说你的应用程序——这是一个什么列表?很酷,谢谢大家。我来试试看结果如何!那么:yourList.indefOf(yourObjectInList);我正在使用java.util.ArrayList和方法indexOf(..)工作得很好