Есть ли способ восстановить объекты из набора в том же порядке, в каком они были переданы?

#java #set #hashset

#java #набор #hashset

Вопрос:

Мне нужно восстановить элементы интерфейса коллекции java Set в том же порядке, в каком они были переданы в набор.

Как это возможно в java

Комментарии:

1. Почему вы не можете просто использовать List ?

2. Вы контролируете реализацию или это чей-то другой код? LinkedHashSet обеспечивает предсказуемый порядок, но если вы просто вызываете интерфейс Set, а реализация чем-то похожа на HashSet, вам не повезло. Упорядоченность наборов по определению не гарантируется.

3. @Space_C0wb0y две наиболее очевидные причины, которые я могу придумать, таковы: запрашивающий не управляет интерфейсом, который предоставляет Set , или запрашивающий хочет гарантировать, что элемент появится в нем только один раз.

4. @space_cowboy Я хочу гарантировать, что элемент появляется только один раз. а также у меня нет особого контроля над кодом

Ответ №1:

Как насчет LinkedHashSet ?

Реализация интерфейса Set в виде хэш-таблицы и связанного списка с предсказуемым порядком итераций. Эта реализация отличается от HashSet тем, что она поддерживает двусвязный список, проходящий через все его записи. Этот связанный список определяет порядок итераций, то есть порядок, в котором элементы были вставлены в набор (insertion-order). Обратите внимание, что порядок вставки не изменяется, если элемент повторно вставляется в набор. (Элемент e повторно вставляется в набор s, если вызывается s.add(e), когда s.contains(e) возвращает значение true непосредственно перед вызовом.)

Ответ №2:

 public class SimpleLinkedHashSetExample {

  public static void main(String[] args) {
    //create object of LinkedHashSet
    LinkedHashSet lhashSet = new LinkedHashSet();

    /*
      Add an Object to LinkedHashSet using
      boolean add(Object obj) method of Java LinkedHashSet class.
      This method adds an element to LinkedHashSet if it is not 
      already present in LinkedHashSet.
      It returns true if the element was added to LinkedHashSet, false otherwise.
    */

    lhashSet.add(new Integer("1"));
    lhashSet.add(new Integer("2"));
    lhashSet.add(new Integer("3"));

    /*
      Please note that add method accepts Objects. Java Primitive values CAN NOT
      be added directly to LinkedHashSet. It must be converted to corrosponding
      wrapper class first.
    */

    System.out.println("LinkedHashSet contains.."   lhashSet);   
  }
}

/*
Output of the program would be
LinkedHashSet contains..[1, 2, 3]
*/ 
  

Вы можете использовать LinkedHashSet, приведенный выше пример.