在一个ArrayList中获取某个元素的索引位置。

20

我有一个名为AuctionItem的类。这个AuctionItem类有一个名为getName()的方法,返回一个String类型的值。如果我有一个类型为AuctionItemArrayList,那么最好的方法是什么来返回列表中具有特定名称的项目的索引?

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

还有更好的方法吗?

8个回答

18

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

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

17

是的,你需要循环它。

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;
}

生命救星... 非常感谢 :) - Ekta Bhawsar

7

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

1- 不使用 ArrayList,而是使用 HashMap<String,AutionItem>,其中 String 将是名称

2- 使用 getName 生成索引,并使用索引为基础的数组列表添加 list.add(int index, E element)。从名称生成索引的一种方法是使用其哈希代码并对 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。

3
for (int i = 0; i < list.length; i++) {
   if (list.get(i) .getName().equalsIgnoreCase("myName")) {
    System.out.println(i);
    break;
  }
}

0
寻找具有名称的项目,我应该只使用for循环,当找到项目时,在ArrayList中返回元素位置吗?
是的,使用循环(使用索引或Iterator)。对于返回值,根据您的需求返回其索引或项目本身。ArrayList没有类似于`indexOf(Object target, Comparator compare)`的方法。现在Java正在获得lambda表达式(在Java 8中,大约在2014年3月),我希望我们会看到API获取接受lambda的方法来处理这些事情。

0

你可以实现 AuctionItemhashCode/equals 方法,使得如果两个对象具有相同的名称,则它们相等。这样做后,你可以使用 ArrayList 的方法 indexOfcontains,例如:arrayList.indexOf(new AuctionItem("The name"))。或者在 equals 方法中假设传递了一个字符串:arrayList.indexOf("The name")。但这不是最好的设计。

我建议使用 HashMap 将名称映射到物品。


0

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

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

一直这样做,直到找到匹配项(或者在范围较小时使用暴力循环遍历,例如20个项目)

您可以在大约13到14个测试中搜索10000项列表,而不是潜在地进行9999个测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接