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

96

我有一个 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中有一个花哨的本机函数我应该利用?


2
这段代码可能存在缺陷:在大多数情况下使用==会产生不正确的结果。 - user166390
3
记住,你不能用'=='比较字符串,你必须使用String.equals(String str)。 - MrZander
5
@MrZander 当然你可以用 == 来比较它们...只是这不是正确的比较方式;-) - user166390
你可以看出我对Java还很陌生.. String.equals 更像 JavaScript 中的 === 吗?例如,检查值和类型是否相等? - Jacksonkr
3
No. == 是指“对象标识”,意思是“是同一个对象”。(若考虑只有一个值为42或字符'x'的数字,则对原始类型和引用类型都适用此观点)。Object.equals 是一种虚拟方法,定义于所有对象实例上,它表示“具有相同的值”,因为所有类类型都扩展自Object,应该用于所有对象相等测试。有很多问题涉及到==Object.equals之间的区别,这是一个非常重要的概念需要理解!例如,以下语句是错误的:"hello" == new String("hello")!咦! - user166390
请参考https://dev59.com/NnRA5IYBdhLWcg3w9izq及相关问题。 - user166390
8个回答

212

ArrayList 有一个 indexOf() 方法。查看 API 获取更多信息,以下是它的工作原理:

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

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

indexOf()会精确地返回与您的方法返回值相同的结果,速度很快。


3
尽管此代码的实现可能更有效率,但在复杂性方面,它与贴出的代码并没有更快。此外,indexOf 在这里会有稍微不同的反应:原始代码 [错误地] 使用 ==,而 indexOf 使用 equals() - user166390
实际上,它几乎完全相同的代码(至少在我手头的Sun Java 6代码中),只是他们用if-else分支开始处理null。 - yshavit
很奇怪,旧的数组和List<>都有FindIndex()方法,但是ArrayList的API在中途发生了变化 :D - boctulus

17
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,我该如何获取该索引的字符串值。谢谢。 - Jimale Abdi
1
@JimaleAbdi 请执行yourArrayList.get(7)。其中7是您要获取的位置。 - Hiren Patel

7
如果您的List已排序并具有良好的随机访问(如ArrayList),则应查看Collections.binarySearch。否则,您应该使用List.indexOf,正如其他人所指出的那样。但是,就算除了==之外,您的算法也是正确的。

4

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


3

在Java中确实有一个很高级的本地函数可以利用。

ArrayList有一个实例方法叫做

indexOf(Object o)

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

您可以如下调用它:

_categories.indexOf("camels")

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

祝好运。


1
本地函数对我来说意味着C\C++。只是这么说而已。 - Hunter McMillen

2

这里最好的解决方案

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)

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

0

在编程中,查找列表中某个元素的最佳方法是使用集合接口。

例如:

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

输出:2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接