Java ArrayList - найти элемент - нужен ли мне хэш? - PullRequest
2 голосов
/ 24 февраля 2011

Я изучаю Java и имею проблему с ArrayList.Я прочитал документацию по Java и думаю, что мне, возможно, нужно сделать хеш-функцию?

У меня есть объект с именем catalog, у которого есть список массивов объектов, созданных из другого класса с именем item.У каждого товара есть поля для размера, цвета, цены, кода товара (это атрибуты товара).Мне нужно включить метод в каталог, который принимает код продукта и выполняет поиск в ArrayList, чтобы найти объект с соответствующим кодом продукта.И затем возвращает этот продукт.У меня есть метод 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 документ и прочитал о хэше, и, может быть, мне лучше использовать его, а не итератор?Я не уверен, какой маршрут выбрать.Мой код наполовину закончен. Любая помощь с благодарностью.Thankls

Ответы [ 6 ]

3 голосов
/ 24 февраля 2011

Учитывая требования вашего вопроса, похоже, вам пока не нужно использовать хеш-код для поиска элемента в вашем каталоге. Вам нужно ...

  1. Пройдите по каталогу
  2. Для каждого элемента в каталоге посмотрите, совпадает ли код продукта элемента, и верните, что

Код может выглядеть примерно так

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

Вы могли бы использовать хеш-коды для ускорения, но для этого ваш каталог должен быть HashMap

3 голосов
/ 24 февраля 2011

То, что вы делаете, может зависеть от того, насколько близки ваши коды продуктов.Я предполагаю, что они не последовательные, и в этом случае вам действительно нужно использовать HashMap.

Когда вы храните элементы в HashMap, храните их, используя информацию, которую вы хотели бы использовать приВы просматриваете их:

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

Затем, когда вам нужно выбрать элемент на основе кода продукта, используйте:

Item item = map.get(code);

1 голос
/ 24 февраля 2011

Есть несколько способов справиться с этим, но на ум приходит переопределение метода equals и hashcode для вашего класса Item и использование следующего:

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

Надеюсь, это поможет.

0 голосов
/ 24 февраля 2011

List предлагает O (n) при поиске, o (1) при добавлении. Но если вы сделаете это по порядку и выполните бинарный поиск, вы можете получить O (long n);

Вы также можете использовать TreeMap, он предлагает O (log n) при поиске и добавлении.

В то время как HashMap всегда предлагает O (1);

0 голосов
/ 24 февраля 2011

Вам следует рассмотреть возможность использования вместо этого HashMap, чтобы вы могли хранить элементы по их (я думаю, уникальному) коду продукта. Но тогда вам также придется переопределить hashCode и равно в Item.

Пример:

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.");
        }
    }
}
0 голосов
/ 24 февраля 2011

ArrayList.get(int) возвращает элемент в указанной позиции в этом списке, item не является int (на самом деле, вы вообще его не определяете), и в любом случае вы будете использовать только get если вы хотели определенную позицию.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...