2015-03-07 6 views
3

мне нужно выполнить следующие операции:Java - конкретная структура данных

(1) проверить, если элементы существуют в O (1)

(2) добавить в O (1)

(3) удалить и вернуть в O (1)

Я думал о Set в java, но поддерживает только (1) и (2). Я знаю, что можно сделать что-то вроде этого set.iterator().next() и set.iterator().remove(), но в чем сложность этого решения?

EDIT

Я хочу что-то вроде этого:

Set<Integer> remaining = new HashSet<>(); 

// add values 

Queue<Integer> queue = new ArrayDeque<>(); 

while(!remaining.isEmpty()) { 
    int val = remaining.iterator().next(); // !!! 
    remaining.iterator().remove();   // !!! 
    queue.add(val); 

    while(!queue.isEmpty()) { 

     List<Integer> valuesToBeRemoved = getValues(); 
     // some logic 
     for(int value : valuesToBeRemoved) { 
       remaining.remove(value); 
     } 

    } 


} 

и мне интересно, если строки, помеченные // !!! являются оптимальными

+2

Из документации «HashSet': _» Этот класс предлагает постоянную производительность времени для основных операций (добавлять, удалять, содержать и размер) »_ Если вы хотите получить элемент; вы можете заглянуть в «HashMap». Хотя эти структуры данных не позволяют дублировать элементы/ключи, так что это может быть не то, что вы ищете. –

+0

Я думаю, что вы не понимаете меня правильно, поэтому я постараюсь написать его более четко. Мне нужно что-то подобное в то время как (! Set.isEmpty()) {int val = set.remove()} Невозможно выполнить использование hashmap, потому что я должен указать элемент в методе get – Paew

+0

Глядя на ваш цикл while, просто используйте итератор получает элемент и использует его метод удаления. Или просто используйте a для каждого цикла и очистите набор в конце или повторно инициализируйте его до новой пустой заданной ссылки .... –

ответ

0

HashSet имеет характеристики O (1) для add(E e) и contains(E e). Для того, чтобы получить какой-либо старый элемент из (и удалить его), вы можете написать

Iterator<Integer> i = set.iterator(); 
int a = i.next(); 
i.remove(); 

Когда вы делаете i.next() вы, возможно, придется искать пустые хэш ведра.

Если вы используете LinkedHashSet, а не HashSet, вы получите аналогичные показатели для add() и , но i.next() быстрее, потому что LinkedHashSet сохраняет ссылку на первый элемент. В общем, гораздо быстрее перебирать LinkedHashSet, чем HashSet, потому что вам просто нужно следовать цепочке ссылок. Обратите внимание, однако, что LinkedHashSet будет использовать больше памяти, чем HashSet, но если это ваша скорость, вас интересует, LinkedHashSet - хороший ответ.

+0

'LinkedHashSet' предоставляет гарантии на порядок вставки и немного дороже из-за этой гарантии. Однако он все равно должен амортизироваться O (1). – Makoto