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


89

对于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本机函数?


2
此代码可能存在缺陷:使用==会在大多数情况下产生错误的结果。

3
请记住,您不能将字符串与“ ==”进行比较,必须使用String.equals(String str)
MrZander 2011年

5
@MrZander确保您可以将它们与==...进行比较……这不是正确的比较方法;-)

您可以说我还是Java的新手。String.equals更像是===JavaScript之类的语言?例如。检查值和类型?
Jacksonkr 2011年

3
编号 ==对象标识,表示“是同一对象”。(如果您认为只有一个数字带有值42或char'x'等,则此视图对于基本值和引用类型均适用。)Object.equals是为所有对象实例定义的虚拟方法,它的含义是“具有相同的值”,因为所有类类型都扩展Object,并且应用于所有对象相等性测试。封面==vs上有很多问题,Object.equals这是一个非常重要的概念!举例来说,这是假的:"hello" == new String("hello")!h!

Answers:


192

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()

实际上,它几乎是完全相同的代码(至少在我拥有的Sun Java 6代码中),只是它们以if-else分支开始,分别处理null。
yshavit 2011年

它是有线的旧数组,List <>具有FindIndex()方法,但是ArrayList的中间API发生了变化:D
boctulus 2014年

16
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

6

如果您List已排序并且具有良好的随机访问权限(也是ArrayList如此),则应调查Collections.binarySearch。否则,您应该使用List.indexOf,正如其他人指出的那样。

但是您的算法是正确的(其他==人没有指出)。


3

您确实应该利用Java中的奇特的shmancy本机函数。

ArrayList有一个称为

indexOf(Object o)

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

您可以_categories按以下方式调用它:

_categories.indexOf("camels")

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

祝好运。


1
原生函数对我来说意味着C \ C ++。
亨特·麦克米伦

3

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


1

查找项目在列表中位置的最佳方法是使用“收藏夹”界面,

例如,

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

输出2


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.