Java set get element by index

Как получить первый элемент из набора java.util.Set?

pContext.getParent().getPropertyValue() — это готовый код, на который у меня нет никакого элемента управления для изменения.

Требование:

Я хотел получить из него первый элемент по умолчанию (всегда). Тем не менее, я не смог найти метод get(index) , как в ArrayList . Следовательно, прямо сейчас я делаю так.

for (Iterator it = siteIdSet.iterator(); it.hasNext();)

@KrishPrabakar Вероятно, нет лучшего способа сделать то, что вы просите (так как очень редко пользователь когда-либо захочет получить только один элемент из Set ). Единственный короткий путь, который я могу придумать, — это использовать цикл for-each вместо цикла for который у вас есть. Это точно так же (функционально), но более читабельно и ремонтопригодно.

Практически все ответы неверны в особом случае, когда у вас есть сет с одним предметом. В этом случае, безусловно, есть «первый» (а также «последний») элемент в наборе. Обидно, что вам нужно создать итератор для доступа к этому.

12 ответов

Как подразумевается его именем, этот интерфейс моделирует математическую абстрактную абстракцию.

В Установить теорию, «набор» представляет собой набор отдельных объектов, которые рассматриваются как самостоятельный объект. «- [Википедия — Установить].

Математически элементы в наборах не индивидуализированы. Их единственная идентичность вытекает из их присутствия в множестве. Поэтому нет смысла получать «первый» элемент в наборе, так как концептуально такая задача нелогична.

Читайте также:  Php get timestamp with timezone

Не может быть никакого смысла получать «первый» элемент из набора, но если вам нужно только один объект из набора (без каких-либо гарантий относительно того, какой объект), вы можете сделать следующее:

for(String aSiteId: siteIdSet)

Это немного более короткий путь (чем метод, который вы опубликовали), чтобы получить «первый» объект Set , однако, поскольку Итератор все еще создается (под капотом), он не дает каких-либо преимуществ в производительности.

Хорошая идея, когда мы разрабатываем, мы обычно пропускаем точку останова и скорее продолжаем искать решение, чтобы получить первый индекс

Это вернет первый элемент

Object firstElement = outcome.stream().findFirst().get(); 

Чтобы вернуться к этому, вы можете изменить .get() на .orElse() если хотите .orElse() значение по умолчанию в случае, если outcome будет пустым.

Set — это уникальный набор элементов. Поэтому нет понятия первого элемента. Если вы хотите, чтобы элементы отсортированы по порядку, вы можете использовать TreeSet, из которого вы можете получить первый элемент, используя TreeSet # первый().

Метод pContext.getParent().getPropertyValue() всегда возвращает Set , поэтому у меня нет возможности изменить его на TreeSet . Более того, я не хочу, чтобы содержимое Set было отсортировано .

Если вы работаете на уровне интерфейса Set, первого элемента нет. Итерируйте список и используйте тот элемент, который он дает вам первым.

TL;DR

Переместите элементы и вызовите first() .

new TreeSet( pContext.getParent().getPropertyValue( … ) // Transfer elements from your `Set` to this new `TreeSet`, an implementation of the `SortedSet` interface. ).first() 

Set Не имеет порядка

Как говорили другие, Set по определению не имеет порядка. Поэтому запрос «первого» элемента не имеет значения.

Некоторые реализации Set имеют порядок, такой как порядок добавления элементов. Этот неофициальный порядок может быть доступен через Iterator . Но этот порядок случайен и не гарантирован. Если вам повезет, реализация, поддерживающая ваш Set , действительно может быть SortedSet .

CAVEAT: Если порядок критический, не полагается на такое поведение. Если надежность не является критичной, такое недокументированное поведение может оказаться полезным. Если задано Set , у вас нет другой жизнеспособной альтернативы, поэтому попробовать это может быть лучше, чем ничего.

Object firstElement = mySet.iterator().next(); 

Чтобы напрямую обратиться к Вопросу. Нет, не самый короткий способ получить первый элемент из итератора при обработке возможного случая пустого набора. Тем не менее, я предпочел бы тест if для isEmpty , а не цикл for .

Использовать SortedSet

Если вам нужно поддерживать порядок сортировки в Set , используйте SortedSet . Такие реализации включают в себя:

Использовать LinkedHashSet Для ввода-заказа

Если вам нужно запомнить элементы в том порядке, в котором они были добавлены в Set , используйте LinkedHashSet .

Чтобы процитировать документ, этот класс.

поддерживает двусвязный список, проходящий через все его записи. Этот связанный список определяет порядок итераций, который представляет собой порядок, в котором элементы были вставлены в набор (порядок вставки).

Set не обеспечивает упорядочение. Нет никакой гарантии, что вы всегда получите «первый» элемент, даже если вы используете итератор над HashSet , как вы это делали в вопросе.

Если вам нужно иметь предсказуемое упорядочение, вам нужно использовать LinkedHashSet . Когда вы перебираете LinkedHashSet, вы получите элементы в том порядке, в который вы вставили. Вам все равно нужно использовать итератор, потому что для метода get в LinkedHashSet вам понадобится использовать конкретный класс везде.

Object firstElement = set.toArray()[0]; 

Как вы упомянули pContext.getParent().getPropertyValue return Set . Вы можете преобразовать Set в List , чтобы получить первый элемент. Просто измените свой код:

 Set siteIdSet = (Set) pContext.getParent().getPropertyValue(..); List siteIdList=new ArrayList<>(siteIdSet); String firstItem=siteIdList.get(0); 

Это сложный вопрос, который я встал против самого себя. java.util.LinkedHashSet поддерживает связанный список его содержимого (добавочно-упорядоченный по умолчанию), но не предоставляет никаких аксессуаров. Другие типы структуры не смогут обеспечить O (1) на add() , remove() и contains() .

Вы можете использовать LinkedHashSet и получить его iterator() , захватить один элемент и отбросить его. Если вы не слишком заботитесь о скорости или памяти, когда часто это делаете для множества разных наборов, это, вероятно, ваше решение. но это казалось мне расточительным. Кроме того, у меня была небольшая дополнительная желаемая функциональность.

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

Если вам интересно, я могу предоставить этот источник. Я еще не Serialized , но он отлично работает во время выполнения.

Если вы не можете гарантировать тип Set , предоставленный каким-либо образом, вам придется придерживаться объекта Iterator .

Источник

Get Elements by Index from HashSet in Java Example

This example shows how to get elements by index from HashSet in Java. The example also shows how to get HashSet elements using an index using an iterator, for loop, array, and list.

How to get elements by index from HashSet in Java?

The HashSet is a collection of unique elements. The order of the elements returned by the HashSet iterator is not constant over time. The HashSet Java document has the below-given explanation for this behavior.

This class implements the Set interface, backed by a hash table (actually a HashMap instance). It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time.

Plus, since the HashSet is backed by a HashMap, there are no methods to access its elements by index.

However, given all that, if you still want to access the elements by index, you can do so by below given ways.

1. Using an array

We can convert the HashSet object to an array and then access the elements using the index as given below.

2. Using an ArrayList or LinkedList

Instead of an array, we can also convert the HashSet object to an ArrayList or a LinkedList and can then use the index.

3. Using an Iterator or a for loop

We can also iterate the HashSet using an Iterator or an enhanced for loop to get the element located at the desired location as given below.

We can also use enhanced for loop as given below.

Important Note:

As we can see from the output above, even though we could get the elements by index, it is not in the order of the insertion. For example, we added element “10” first in the set, but in the output, we can see that it is at index 4. Plus, it is not even guaranteed that we will get the element “10” constantly at index 4.

The HashSet is not an appropriate choice of collection if you want to access the elements using an index. If your requirement is such, you should use any List implementation like LinkedList or ArrayList. If you want the Set functionality but want to maintain the insertion order of the elements, you can use the LinkedHashSet but then you will not be able to get elements by index.

Please let me know your views in the comments section below.

About the author

I have a master’s degree in computer science and over 18 years of experience designing and developing Java applications. I have worked with many fortune 500 companies as an eCommerce Architect. Follow me on LinkedIn and Facebook.

Java HashSet

Java HashSet

Java HashSet

Java HashSet

LinkedHashSet

Java HashSet

Java HashSet

Java HashSet

Java String tutorial with examples

Java ArrayList tutorial with examples

2 comments

Hi RahimV,
I want you to mentor me in my software development life as i am currently in third year pursuing CSE as my major.I face lot of difficulty when i implement some algorithms ,and the problem is i don’t have any human support and this results in too much waste of time to complete some courses.Therefore i request you to become my mentor as this will help me to become a good programmer in my career.

Hi Dhananjay, What you call a waste of time is in fact the learning process. Everyone passes through that phase. That is the right way to learn, by making mistakes and learn from them. Mentoring is not feasible, nor required. Keep doing the hard work you are already doing and I am sure you will learn quite a lot. Thanks and good luck.

Источник

Как получить элемент из set в java

Для получения элемента из Set в Java можно использовать метод Iterator.next() , который возвращает следующий элемент из набора.

SetString> nums = new HashSet<>(); nums.add("one"); nums.add("two"); nums.add("three"); IteratorString> iterator = nums.iterator(); String element = iterator.next(); System.out.println(element); // => one 

Также можно использовать цикл for-each для перебора всех элементов в Set и получения каждого из них:

for (String element : nums)  System.out.println(element); // выводит все элементы в произвольном порядке > 

Обратите внимание, что порядок элементов в Set не гарантируется, поэтому использование итератора может быть предпочтительнее, если вам нужно получить элементы в определенном порядке.

Источник

Оцените статью