【问题标题】:Better way to find index of item in ArrayList?在 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")!哇!

标签: java for-loop arraylist


【解决方案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++.. 只是说。
            猜你喜欢
            • 2012-10-31
            • 1970-01-01
            • 1970-01-01
            • 2019-08-06
            • 2016-06-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多