在 ArrayList 中查找项目索引的更好方法?

Posted

技术标签:

【中文标题】在 ArrayList 中查找项目索引的更好方法?【英文标题】:Better way to find index of item in ArrayList? 【发布时间】:2012-01-16 08:44:57 【问题描述】:

对于 android 应用,我有以下功能

private ArrayList<String> _categories; // eg ["horses","camels"[,etc]]

private int getCategoryPos(String category) 
    for(int i = 0; i < this._categories.size(); ++i) 
        if(this._categories.get(i) == category) return i;
    

    return -1;

这是编写获取元素位置的函数的“最佳”方式吗?还是我应该利用 java 中的花哨的 shmancy 本机函数?

【问题讨论】:

这段代码可能有缺陷:在大多数情况下,使用== 会产生不正确的结果。 记住,你不能用'=='比较字符串,你必须使用String.equals(String str) @MrZander 当然,您可以将它们与== 进行比较......这不是正确的比较;-) 你可以说我还是 Java 新手。String.equals 更像是 ===javascript 这样的语言中可能是什么?例如。检查值和类型? No. ==object-identity,表示“是同一个对象”。 (这个观点适用于原始值和引用类型,如果你认为只有一个数值为 42 或 char 'x' 等)。 Object.equals 是为所有对象实例定义的虚拟方法,它意味着“具有相同的值”,因为所有类类型都扩展了 Object,并且应该用于所有 对象平等测试。 封面==Object.equals有很多问题,这是一个非常重要的概念!例如,这是错误的:"hello" == new String("hello")!哇! 【参考方案1】:

这里最好的解决方案

class Category(var Id: Int,var Name: String)
arrayList is Category list
val selectedPositon=arrayList.map  x->x.Id .indexOf(Category_Id)
spinner_update_categories.setSelection(selectedPositon)

【讨论】:

【参考方案2】:

使用 indexOf() 方法查找集合中第一次出现的元素。

【讨论】:

【参考方案3】:

在列表中查找项目位置的最佳方法是使用 Collections 接口,

例如,

List<Integer> sampleList = Arrays.asList(10,45,56,35,6,7);
Collections.binarySearch(sampleList, 56);

输出:2

【讨论】:

【参考方案4】:

ArrayList 有一个indexOf() method。查看 API 了解更多信息,但它的工作原理如下:

private ArrayList<String> _categories; // Initialize all this stuff

private int getCategoryPos(String category) 
  return _categories.indexOf(category);

indexOf() 将准确返回您的方法返回的内容,速度很快。

【讨论】:

它在复杂性方面并没有比发布的代码“更快”,尽管它可以更有效地实现。此外, indexOf 在这里的反应会略有不同:原始代码 [错误地] 使用 == 而 indexOf 使用 equals() 事实上,它几乎是完全相同的代码(至少在我拥有的 Sun Java 6 代码中),只是它们以单独处理 null 的 if-else 分支开始。 它是有线的旧数组,List 有 FindIndex() 方法,但是 ArrayList 的 API 在中间发生了变化:D【参考方案5】:
ArrayList<String> alphabetList = new ArrayList<String>();
alphabetList.add("A"); // 0 index
alphabetList.add("B"); // 1 index
alphabetList.add("C"); // 2 index
alphabetList.add("D"); // 3 index
alphabetList.add("E"); // 4 index
alphabetList.add("F"); // 5 index
alphabetList.add("G"); // 6 index
alphabetList.add("H"); // 7 index
alphabetList.add("I"); // 8 index

int position = -1;
position = alphabetList.indexOf("H");
if (position == -1) 
    Log.e(TAG, "Object not found in List");
 else 
    Log.i(TAG, "" + position);

输出: 列表索引:7

如果你传递 H,它将返回 7,如果你传递 J,它将返回 -1我们将默认值定义为 -1。

完成

【讨论】:

我怎样才能使这个反之亦然,对于您的解决方案,您的输入是 H 并且您得到 H 的位置,假设如果我输入是 7 的索引,我如何获得该索引的字符串值。谢谢 @JimaleAbdi 执行 yourArrayList.get(7)。 7 是你的位置。【参考方案6】:

如果您的List 已排序并且具有良好的随机访问性(就像ArrayList 一样),您应该查看Collections.binarySearch。否则,您应该使用List.indexOf,正如其他人指出的那样。

但是你的算法是正确的,fwiw(除了== 其他人指出的)。

【讨论】:

【参考方案7】:

Java API 指定了两种可以使用的方法:indexOf(Object obj)lastIndexOf(Object obj)。如果找到,第一个返回元素的索引,否则返回 -1。第二个返回最后一个索引,就像向后搜索列表一样。

【讨论】:

【参考方案8】:

在 java 中确实有一个花哨的 shmancy 原生函数,你应该利用它。

ArrayList 有一个名为的实例方法

indexOf(Object o)

(http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html)

您可以在_categories 上调用它,如下所示:

_categories.indexOf("camels")

我没有为 Android 编程的经验 - 但这适用于标准 Java 应用程序。

祝你好运。

【讨论】:

本机函数对我来说意味着 C\C++.. 只是说。

以上是关于在 ArrayList 中查找项目索引的更好方法?的主要内容,如果未能解决你的问题,请参考以下文章

在包含字符串的 ArrayList 中查找索引

获取数组列表中项目的索引;

Python 列表查找,如何在列表中查找项目或者元素索引翻译

哪个更好:书签/键查找或索引扫描

ArryayList 和linkedList的比较

JavaScript DOM:在容器中查找元素索引