【问题标题】:Getting Index of an item in an arraylist;获取数组列表中项目的索引;
【发布时间】:2013-04-29 21:52:04
【问题描述】:

我有一个名为AuctionItem 的类。 AuctionItem 类有一个名为 getName() 的方法,它返回一个 String。如果我有一个AuctionItem 类型的ArrayList,那么返回ArrayList 中具有特定名称的项目的索引的最佳方法是什么?

我知道有一个.indexOf() 函数。这个函数的参数是一个对象。要查找具有名称的项目,我是否应该只使用 for 循环,当找到该项目时,返回 ArrayList 中的元素位置?

有没有更好的方法?

【问题讨论】:

    标签: java arraylist find element indexof


    【解决方案1】:

    我认为 for 循环应该是一个有效的解决方案:

        public int getIndexByname(String pName)
        {
            for(AuctionItem _item : *yourArray*)
            {
                if(_item.getName().equals(pName))
                    return *yourarray*.indexOf(_item)
            }
            return -1;
        }
    

    【讨论】:

      【解决方案2】:

      是的。你必须循环播放它

      public int getIndex(String itemName)
      {
          for (int i = 0; i < arraylist.size(); i++)
          {
              AuctionItem auction = arraylist.get(i);
              if (itemName.equals(auction.getname()))
              {
                  return i;
              }
          } 
      
          return -1;
      }
      

      【讨论】:

      • 救生员...非常感谢:)
      【解决方案3】:

      基本上您需要根据名称getName 查找ArrayList 元素。解决这个问题的两种方法:

      1- 不要使用ArrayList,使用HashMap&lt;String,AutionItem&gt;,其中String 是名称

      2- 使用getName 生成索引并使用基于索引的添加到数组列表list.add(int index, E element)。从名称生成索引的一种方法是使用它的 hashCode 和 ArrayList 当前大小取模(类似于 HashMap 内部使用的东西)

      【讨论】:

        【解决方案4】:

        .indexOf() 效果很好。 如果你想要一个例子,这里是一个:

          ArrayList<String> example = new ArrayList<String>();
          example.add("AB");
          example.add("CD");
          example.add("EF");
          example.add("GH");
          example.add("IJ");
          example.add("KL");
          example.add("MN");
        
          System.out.println("Index of 'AB': "+example.indexOf("AB"));
          System.out.println("Index of 'KL': "+example.indexOf("KL"));
          System.out.println("Index of 'AA': "+example.indexOf("AA"));
          System.out.println("Index of 'EF': "+example.indexOf("EF"));
        

        会给你一个输出

        Index of 'AB': 0
        Index of 'KL': 5
        Index of 'AA': -1
        Index of 'EF': 2
        

        注意:如果指定的元素不在列表中,则此方法返回 -1。

        【讨论】:

          【解决方案5】:
          for (int i = 0; i < list.length; i++) {
             if (list.get(i) .getName().equalsIgnoreCase("myName")) {
              System.out.println(i);
              break;
            }
          }
          

          【讨论】:

            【解决方案6】:

            要找到有名字的项目,我是不是应该只使用for循环,找到项目后,返回ArrayList中的元素位置?

            是的循环(使用索引或Iterator)。在返回值上,根据您的需要返回其索引或项目本身。 ArrayList 没有 indexOf(Object target, Comparator compare)` 或类似的。现在 Java 正在获得 lambda 表达式(在 Java 8 中,~2014 年 3 月),我希望我们会看到 API 获得接受 lambda 的方法来处理此类事情。

            【讨论】:

              【解决方案7】:

              您可以实现您的AuctionItemhashCode/equals,这样如果它们具有相同的名称,它们中的两个就相等。当您这样做时,您可以使用ArrayListindexOfcontains 方法,如下所示:arrayList.indexOf(new AuctionItem("The name"))。或者当您在 equals 方法中假设传递了一个字符串时:arrayList.indexOf("The name")。但这不是最好的设计。

              但我也更喜欢使用 HashMap 将名称映射到项目。

              【讨论】:

                【解决方案8】:

                而不是通过列表进行暴力循环(例如 1 到 10000),而是使用迭代搜索方法: List 需要按要测试的元素进行排序。

                从中间元素 size()/2 开始搜索,例如 5000 如果搜索项大于 5000 处的元素,则在上(10000)和中点(5000)之间的中点测试元素 - 7500

                一直这样做,直到你达到匹配(或者一旦你下降到更小的范围(例如 20 个项目)就使用蛮力循环遍历

                您可以在大约 13 到 14 个测试中搜索 10000 个列表,而不是可能的 9999 个测试。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-06-15
                  • 2019-01-25
                  • 1970-01-01
                  • 2011-01-28
                  • 2014-10-19
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多