#java
#java
Вопрос:
У меня сложный вопрос для меня, чтобы объяснить. В некоторых словах у меня есть Set<object>
, и мне нужно получать элементы один за другим (т. Е. Мне нужно получить только элемент набора), но я не могу, если из цикла for . Например, здесь я могу получить все:
for (Iterator<Object> i = fh.getParsed().iterator(); i.hasNext();) {
HTTPFormat next = (HTTPFormat) i.next();
System.out.println(next.getIP());
}
но если я хотел бы напечатать только элемент (например, System.out.println(trial.getParsed().get(0)). Чтобы быть понятым, я говорю, что у меня есть набор с именем «parsed» в классе в качестве атрибута и getter для parsed . Я не знаю, был ли я также ясен, но я надеюсь, что да. Если у вас есть сомнения, не стесняйтесь спрашивать! Спасибо!
Комментарии:
1. Итак, если вы хотите напечатать первый, почему бы вам не выполнить код, который вы предлагаете, или не использовать цикл?
2. Вообще говоря, наборы не упорядочены, поэтому, если ваш набор содержит более одного элемента, нет гарантии, какой элемент вы получите, если попросите «первый». В частности, если вы выполняете итерацию и берете первый элемент в итерации, нет никакой гарантии, что это элемент, который был добавлен первым в набор
Ответ №1:
Если вам нужен один элемент Set
, вы можете написать
HTTPFormat element = (HTTPFormat) fh.getParsed().iterator().next();
Это вернет первый элемент в Set
соответствии с порядком итерации. Если это упорядоченный набор (например, TreeSet
), будет возвращен первый элемент в соответствии с этим порядком. Если это a HashSet
, он вернет произвольный элемент (который зависит от hashCode()
реализации HTTPFormat
и текущего размера Set
).
Обратите внимание, что он выдаст исключение, если значение Set
пустое.
PS Я бы не стал использовать Set<Object>
. Если ваш Set
содержит HTTPFormat
элементы, используйте a Set<HTTPFormat>
, чтобы избежать небезопасного приведения.
Комментарии:
1. Или просто распечатайте его, избегая необходимости в слепке. 1
2. @PeterLawrey Верно, но это сработает только в том случае, если OP захочет распечатать весь элемент (как указано в печати
getIP()
, как в фрагменте кода в вопросе).3. я думал добавить ту же информацию, которую вы только что добавили, 1
Ответ №2:
Если вы используете Java8 , вы можете использовать findAny
или findOne
для извлечения одного элемента из коллекции, как показано ниже
HTTPFormat element = (HTTPFormat) fh.getParsed().stream().findAny().orElse(defaultObject());
find*
возвращает необязательный объект, который безопасен в использовании, и вы можете передать / получить элемент по умолчанию, если коллекция пуста.
если вам нужен первый элемент, который вы можете использовать findFirst
в случае упорядоченной коллекции