Как получить индекс элемента в 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");
Ответ 5
Одно из решений (хотя и не очень приятное) - использовать общую переменную List/Set Apache
import org.apache.commons.collections.list.SetUniqueList;
final List<Long> vertexes=SetUniqueList.setUniqueList(new LinkedList<>());
это список без дубликатов
https://commons.apache.org/proper/commons-collections/javadocs/api-3.2.2/index.html?org/apache/commons/collections/list/SetUniqueList.html