Как получить индекс элемента в java.util.Set

Я знаю различия между Set и List (разрешены уникальные против дублирования, а не упорядоченные/упорядоченные и т.д.). Я ищу набор, который сохраняет упорядоченные элементы (что легко), но я также должен иметь возможность восстановить индекс, в который был вставлен элемент. Поэтому, если я вставляю четыре элемента, то я хочу знать порядок, в котором один из них был вставлен.

MySet<String> set = MySet<String>();
set.add("one");
set.add("two");
set.add("three");
set.add("four");

int index = set.getIndex("two");

Поэтому в любой момент я могу проверить, была ли добавлена ​​String и получить индекс строки в наборе. Есть ли что-нибудь подобное, или мне нужно реализовать его самостоятельно?

Ответы

Ответ 1

Небольшой статический пользовательский метод в классе Util поможет:

 public static int getIndex(Set<? extends Object> set, Object value) {
   int result = 0;
   for (Object entry:set) {
     if (entry.equals(value)) return result;
     result++;
   }
   return -1;
 }

Если вам нужен/нужен один класс, который является Set и предлагает метод getIndex(), я настоятельно рекомендую реализовать новый Set и использовать шаблон декоратора:

 public class IndexAwareSet<T> implements Set {
   private Set<T> set;
   public IndexAwareSet(Set<T> set) {
     this.set = set;
   }

   // ... implement all methods from Set and delegate to the internal Set

   public int getIndex(T entry) {
     int result = 0;
     for (T entry:set) {
       if (entry.equals(value)) return result;
       result++;
     }
     return -1;
   }
 }

Ответ 2

После создания Set просто преобразуйте его в List и получите по индексу из списка:

Set<String> stringsSet = new HashSet<>();
stringsSet.add("string1");
stringsSet.add("string2");

List<String> stringsList = new ArrayList<>(stringsSet);
stringsList.get(0); // "string1";
stringsList.get(1); // "string2";

Ответ 3

вы можете расширить LinkedHashSet, добавив желаемый метод getIndex(). Это 15 минут, чтобы реализовать и протестировать его. Просто перейдите через набор, используя итератор и счетчик, проверьте объект на равенство. Если найдено, верните счетчик.

Ответ 4

Как насчет добавления строк в хеш-таблицу, где значение является индексом:

  Hashtable<String, Integer> itemIndex = new Hashtable<>();
  itemIndex.put("First String",1);
  itemIndex.put("Second String",2);
  itemIndex.put("Third String",3);

  int indexOfThirdString = itemIndex.get("Third String");