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

Jac*_*nkr 79 java for-loop arraylist

对于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;
}
Run Code Online (Sandbox Code Playgroud)

这是编写函数获取元素位置的"最佳"方法吗?或者我应该利用java中的一个奇特的shmancy本机函数?

Jon*_*and 180

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

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

private int getCategoryPos(String category) {
  return _categories.indexOf(category);
}
Run Code Online (Sandbox Code Playgroud)

indexOf() 将快速返回您的方法返回的内容.

  • 尽管可以更有效地实现,但在复杂性方面并不比发布的代码"快".此外,indexOf在这里会有不同的反应:原始代码[错误地]使用`==`而indexOf使用`equals()`. (3认同)

Hir*_*tel 15

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);
}
Run Code Online (Sandbox Code Playgroud)

输出:列表索引:7

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

完成


ysh*_*vit 6

如果您List已经排序并具有良好的随机访问权限(如同ArrayList),您应该查看Collections.binarySearch.否则,你应该使用List.indexOf,正如其他人所指出的那样.

但你的算法是合理的,fwiw(除了==其他人指出的).