获取数组列表中项目的索引;

Posted

技术标签:

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

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

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

有没有更好的方法?

【问题讨论】:

【参考方案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 个测试。

【讨论】:

以上是关于获取数组列表中项目的索引;的主要内容,如果未能解决你的问题,请参考以下文章

获取列表中新添加项目的索引?

使用 LINQ 排序后获取集合中项目的新索引

如何获取numpy数组中所有NaN值的索引列表?

如何从 UITableView 获取行索引,其中数组列表由追加到类

数组入门

索引超出数组范围:杂货项目列表添加