Наборы Java против списков

#java

#java

Вопрос:

Может кто-нибудь предложить мне тип / структуру данных в java, которая удовлетворяет: 1) нет фиксированного размера 2) не сортирует данные автоматически. Данные должны храниться в том порядке, в котором они поступают 3) в нем должны храниться только уникальные записи 4) его элементы доступны или, по крайней мере, первый элемент должен быть!

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

Пожалуйста, любые предложения. Спасибо!

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

1. Связанный набор хэшей

2. Первый элемент просто set.iterator().next() .

Ответ №1:

Вы можете использовать LinkedHashSet , если не хотите писать свою собственную структуру. Получение элементов может быть довольно сложным, попробуйте это:

Integer lastInteger = set.stream().skip(set.size()-1).findFirst().get();

Это приведет к получению последнего элемента, если вам нужны разные элементы, вам нужно пропустить другое количество. Это только один из способов, вы можете получить итератор и выполнить итерацию самостоятельно и т.д. Не забудьте переопределить hashCode и equals при работе с наборами.

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

1. OP запрашивает только первый элемент, что очень просто, это просто set.iterator().next() .

Ответ №2:

LinkedHashSet это правильная структура данных для ваших требований.

Вы можете получить доступ к первому элементу следующим образом:

 Set<String> set = new LinkedHashSet<>();
set.add("a");
set.add("b"); // And so on

// Retrieve first element
// Will throw NoSuchElementException if set is empty
String firstElement = set.iterator().next(); 

// Retrieve and remove first element
Iterator<String> i = set.iterator();
String otherFirstElement = i.next();
i.remove();
  

Для доступа к другим элементам см. Ответ от @Whatzs .

Ответ №3:

Если я правильно понимаю ваш вопрос, вы ищете структуру данных, которая сочетала бы свойства набора и ArrayList, своего рода «ArraySet».

Я ничего не нашел в core java для этого, но похоже, что Android JDK имеет такую структуру данных.

https://developer.android.com/reference/android/util/ArraySet.html
https://android.googlesource.com/platform/frameworks/base/ /master/core/java/android/util/ArraySet.java

Одним из решений может быть создание собственного на основе реализации Android.