在 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 中查找项目索引的更好方法?的主要内容,如果未能解决你的问题,请参考以下文章