2012-01-16 2 views
144

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

+3

Комплект не имеет первого элемента. Для списка: list.get (0); –

+0

Что у вас есть, список или набор? Набор может не обязательно быть в каком-либо конкретном порядке ... – NominSim

+0

Вы даже прочитали документацию API для «Список» Java? Подсказка: нет такой вещи, как «первый элемент» в 'Set'. – tobiasbayer

ответ

168
Collection c; 

Iterator iter = c.iterator(); 

Object first = iter.next(); 

(Это ближайший вы получите к тому, «первый» элемент Set. Вы должны понимать, что это не имеет абсолютно никакого значения для большинства реализаций Set. Это может иметь значение для LinkedHashSet и TreeSet , но не для HashSet.)

+4

полезно, если вы просто хотите получить что-либо из набора, как можно быстрее – HaydenKai

+2

Достаточно хорошо, если ваш набор имеет только один элемент. – milosmns

1

Вы можете использовать метод get (index) для доступа к элементу из списка.

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

186

Смотрите Javadoc

из List

list.get(0); 

или Set

set.iterator().next(); 

и проверить размер перед использованием вышеописанных способов, вызывая isEmpty()

!list_or_set.isEmpty() 
+7

Используйте 'isEmpty()' вместо 'size()> 0'. Это лучше показывает ваши намерения и, возможно, более эффективно (например, LinkList size() - O (n)). –

+5

@SteveKuo LinkedList имеет переменную размера, поэтому size() - O (1). Кроме того, isEmpty() реализуется как size() == 0. – efritz

+1

Всегда используйте 'List.iterator(). Next()' или 'Set.iterator(). Next()', чтобы избежать O (N) для связанных данных структуры, вы никогда не знаете, какую реализацию вы будете получать, и, конечно, проверьте с помощью 'Set.isEmpty()' или 'List.isEmpty() 'по той же причине, для обоих случаев всегда будет O (1) вместо потенциального O (N), если, опять же, реализация связанной структуры данных передается любимым' LinkedList' или 'LinkedHashSet' –

6

Это не точный ответ на этот вопрос, но в случае, если объекты должны быть отсортированы SortedSet имеет метод первый():

SortedSet<String> sortedSet = new TreeSet<String>(); 
sortedSet.add("2"); 
sortedSet.add("1"); 
sortedSet.add("3"); 
String first = sortedSet.first(); //first="1" 

Отсортированные объекты должны реализовать Сопоставимый интерфейс (например, строка делает)

+0

хорошо иметь доступ к методу 'first', но здесь вопрос касается списка/набора независимо от порядка. – ciekawy

+0

Я знаю, на вопрос был дан ответ, когда я разместил это, это просто означает как соответствующую информацию. Я думал, что, вероятно, кто-то, кто ищет ответ на это, в некоторых случаях захочет работать с отсортированными объектами. Я отредактировал свой ответ. – molholm

58

В Java> = 8 можно также использовать Streaming API:

Optional<String> first = set.stream().findFirst(); 

(Полезно, если Set/Список может быть пустым.)

+0

Это выглядит великолепно, но без get() Я не смог бы вызвать результирующие методы, специфичные для элемента. 'set.stream(). FindFirst(). Get() 'позволит вам вызывать любые методы для результирующего объекта. например: 'set.stream(). findFirst(). get(). getMessage()' – Diablo

+2

@Diablo Будьте осторожны, потому что 'get()' будет генерировать исключение, если необязательный пуст. Существует множество других методов на «Факультативном», которые могут быть более подходящими. – Magnilex

+0

, если вы хотите, чтобы он возвращал значение null, просто выполните 'String first = set.stream(). FindFirst(). OrElse (null);' – troosan

4

Набор

set.toArray()[0]; 

Список

list.get(0); 
+10

'set.toArray() [0]' будет проходить через все содержимое набора для создания массива, чтобы получить только первый элемент, что не очень эффективно. – dpedro

+0

это приведет к очень низкой производительности. – ZetaPR

+0

Для набора этот метод возвращает 'Object', а не тип элемента в' Set'. – Paul

-1

Менее полированный решение может быть даже

T first = null; //or "empty" placeholder 
for(T elem: mySet /* or myList */){ 
    first = elem; 
    break; 
} 
if (first != null) { 
    //Do something 
} 
+0

Почему это было ниспровергнуто? Есть ли что-то, что мне не хватает, потому что это кажется мне несколько верным. –

+0

это эквивалентно решению итератора, гораздо более подробный, я думаю, что это была причина для downvote, хотя это было не мной – borowis

12

Я удивлен, что никто не предложил гуавы решение еще:

com.google.common.collect.Iterables.get(collection, 0) 
// or 
com.google.common.collect.Iterables.get(collection, 0, defaultValue) 
// or 
com.google.common.collect.Iterables.getFirst(collection, defaultValue) 

или если вы ожидаете одного элемента:

com.google.common.collect.Iterables.getOnlyElement(collection, defaultValue) 
// or 
com.google.common.collect.Iterables.getOnlyElement(collection) 
2

и далее

Set<String> set = new TreeSet<>(); 
    set.add("2"); 
    set.add("1"); 
    set.add("3"); 
    String first = set.stream().findFirst().get(); 

Это поможет вам получить первый элемент списка или набора. Учитывая, что множество или список не пуст (get() на пустой опциональный выбросит java.util.NoSuchElementException)

orElse() могут быть использованы в качестве: (это просто работа вокруг - не рекомендуется)

String first = set.stream().findFirst().orElse(""); 
set.removeIf(String::isEmpty); 

Ниже соответствующий подход:

Optional<String> firstString = set.stream().findFirst(); 
if(firstString.isPresent()){ 
    String first = firstString.get(); 
} 

Аналогично первый элемент списка может быть восстановлена.

Надеюсь, это поможет.

2

Предположим, что у вас есть List<String> strings, из которого вы хотите получить первый элемент.

Есть несколько способов сделать это:

Java (до 8):

String firstElement = null; 
if (!strings.isEmpty() && strings.size() > 0) { 
    firstElement = strings.get(0); 
} 

Java 8:

Optional<String> firstElement = strings.stream().findFirst(); 

гуавы

String firstElement = Iterables.getFirst(strings, null); 

Apache Commons (4+)

String firstElement = (String) IteratorUtils.get(strings, 0); 

Apache Commons (до 4)

String firstElement = (String) CollectionUtils.get(strings, 0); 

с последующим или инкапсулированные в соответствующих проверок или попытаться прилов блоки.

Смежные вопросы