Java ArrayList - 查找项目 - 我需要哈希吗?

时间:2011-02-23 23:43:29

标签: java arraylist hashmap

我正在学习Java并遇到ArrayList问题。我已经阅读了Java文档,并且我想我可能需要做哈希事情?

我有一个名为catalog的对象,它有一个从另一个名为item的类创建的对象数组列表。每个项目都有大小,颜色,价格,产品代码的字段(这些是项目属性)。我需要在目录中包含一个方法,该方法接受产品代码并搜索ArrayList以查找具有匹配产品代码的对象。然后返回该产品。 我的item类中有一个toString方法,列出了所有字段和&他们的价值在被召唤时也许这是在数组列表中找到匹配的产品代码时应返回的内容?

import java.util.ArrayList;


public class Catalogue
{

   private ArrayList<Item> catalogue;


    public Catalogue ()
    { 

      catalogue = new ArrayList<Item>();

    }

    public void findItem(int code)
    {
        if(Item.code == prodcode){

        }
        else{
            System.out.println(catalogue.get(item));

        }
    }

我查看了Java doc并且我读到了关于hash的内容,也许我更好地使用它而不是迭代器?我不确定要走哪条路线。我的代码已完成一半 任何帮助非常感谢。 Thankls

6 个答案:

答案 0 :(得分:3)

您所做的工作取决于您的产品代码的距离。我猜它们不是顺序的,在这种情况下你确实需要使用HashMap。

当您在HashMap中存储项目时,请在查找时将其存储为您要使用的信息:

Map<Integer, Item> catalog = new HashMap<Integer, Item>();
catalog.put(item.code, item);

然后,当您需要根据产品代码获取项目时,请使用:

Item item = map.get(code);

答案 1 :(得分:3)

鉴于您的问题中的要求,您似乎还不需要使用哈希码来查找目录中的项目。你需要......

  1. 遍历目录
  2. 对于目录中的每个项目,查看项目的产品代码是否匹配并返回
  3. 代码可能看起来像这样

    public Item findItem(int code)
    {
        for(Item item: catalogue) {
            if (item.getCode()==code) {
                return item
            }
        }
        return null;
    }
    

    您可以使用哈希码来加快速度,但为此您的目录必须是HashMap

答案 2 :(得分:1)

有几种方法可以解决这个问题,但是想到的一种方法是为Item类重写equals和hashcode方法并使用以下方法:

public void findItem(int code) {
    int index = catalogue.indexOf(code);

    if (index == -1) { 
        System.out.println("didn't find the item");
    } else {
        System.out.println(catalogue.get(index));
    }
}

请记住,您必须覆盖equals和hashCode方法,才能仅根据代码成员变量比较两个Item对象。

如果您经常这样做,可以考虑创建一个HashMap,因为查找时间是不变的。您可以通过执行以下操作来实现此目的:

Map<Integer,Item> catalogueLookup = new HashMap<Integer,Item>();
for( Item item : catalogue ) {
    catalogueLookup.put( item.getCode(), item );
}

希望有所帮助。

答案 3 :(得分:0)

ArrayList.get(int)返回此列表中指定位置的元素,item不是int(实际上,您根本没有定义它),无论如何你如果你想要一个特定的职位,我只会使用get

http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html#get%28int%29

答案 4 :(得分:0)

您应该考虑使用HashMap,这样您就可以通过其(我猜的)唯一的产品代码来存储项目。但是你还必须在Item中覆盖hashCode和equals。

示例:

import java.util.HashMap;
import java.util.Map;

public class Catalogue {

    private Map<Integer, Item> catalogue;

    public Catalogue () { 
      catalogue = new HashMap<Integer, Item>();
    }

    public void findItem(int prodcode) {
        Item item = catalogue.get(prodcode);
        if (item != null) {
            System.out.println("Found item: " + item);
        } else {
            System.out.println("Item with code " + prodcode + " was not found.");
        }
    }
}

答案 5 :(得分:0)

List在搜索时提供O(n),在添加时提供o(1)。但是如果你按顺序进行二进制搜索,你就可以获得O(long n);

您也可以使用TreeMap,在搜索和添加时提供O(log n)。

虽然HashMap总是提供O(1);