Почему у API коллекций Java нет последнего метода? [закрыто]

19

Это для упорядоченных коллекций, например, java.util.List. Почему разработчики языка не включили последний метод? Единственные причины, которые я могу придумать:

  • неоднозначность, когда коллекция пуста (вернуть ноль или сгенерировать исключение)
  • API раздувать

Любые другие причины?

три чашки
источник
9
+1 за огромное количество раз, что я должен был написать collection.get(collection.size() - 1).
jprete
1
Почему бы не написать свой собственный служебный класс с этим методом и любой другой метод, который вы можете использовать с коллекциями?
Махмуд Хоссам
7
Также нет метода first (), так почему же должен быть метод last ()?
Питер Тейлор
6
@Peter Ух, единственное, что хуже, чем не реализовывать getLast (), это реализовать его с помощью хака, подобного get (-1).
Alb
2
@Alb Я думаю, что "взлом" находится в глазах смотрящего :) На данный момент, я ценю синтаксис Python -1. Конечно, если вы спросите меня снова когда-нибудь в будущем или в прошлом, я могу чувствовать себя точно так же, как вы.
три чашки

Ответы:

13

Раздувание API, вероятно, ответ. Исходя из моего опыта, единственное время, когда мне понадобились эти функции, очередь или стек, была правильная структура данных для работы с соответствующим методом.

стихарь
источник
Полагаю, вы частично правы, но если бы Java поддерживала get(-1)извлечение из конца списка, она делала бы то, что хотел OP, не добавляя раздувание API. Мой ответ как таковой вызвал необъяснимые отрицательные голоса.
user949300
1
Я думаю, что больший ответ заключается в том, что первоначальный сбой Java (повторяющийся в .NET и все еще продолжающийся в последнем случае) для поддержки методов интерфейса по умолчанию означал, что наличие интерфейсов, включающих член, который 99% реализаций будет обрабатывать таким же образом, потребовало бы дополнительной работы. на всех реализациях в интересах тех немногих, которые будут реализовывать их по-разному.
суперкат
16

last()метод столь же легко , как list.get(list.size()-1), точно так же как не существует first()способ или fifth()метод. Это не так сложно синтезировать и это специализация. Вы также можете reverse()список и list.get(0)который даст lastэлемент. Вещи, которые легко сделать, обычно не имеют собственных специализированных методов.

import java.util.ArrayList;
import java.util.List;

public class Main
{
    public static void main(String[] args)
    {
        final List<String> l = new ArrayList<String>();

        l.add("A");
        l.add("B");
        l.add("Z");

        System.out.println("l.get(0) = " + l.get(0));
        System.out.println("l.get(l.size()-1) = " + l.get(l.size() - 1));
    }
}

приводит к следующему выводу

l.get(0) = A
l.get(l.size()-1) = Z

также самонадеянно предполагать, что все, что реализует Listинтерфейс, на самом деле имеет понятие last()чего-либо.


источник
1
Хотя в обоих случаях было бы яснее
Анто
Обратите внимание, что метод size () может быть не в состоянии ответить, если коллекция еще не заполнена полностью.
1
.size()вернет текущий размер, .size()-1все равно будет последним элементом независимо от того, как он узнает, был ли он полностью заполнен или нет?
1
По спецификации, список может содержать больше, чем элементы Integer.MAX_VALUE, и в этом случае size () возвращает Integer.MAX_VALUE, поэтому .size()-1это не идеальный способ реализации last()(хотя такой большой список маловероятен, и мне интересно, как такой список реализовал бы toArray()...)
user281377
1
C # имеет метод .First & .Last. Перевернуть список, чтобы получить последний элемент, тоже не совсем эффективно.
Карра
5

java.util.LinkedListОпределяет getLast()и getFirst()методы. К сожалению, эти методы не определены ни в одном из его интерфейсов, поэтому вы должны использовать тип LinkedList. Если вас интересует только последний элемент, вы можете использовать метод java.util.Queueинтерфейса peek(). LinkedList реализует очередь.

Рене Линк
источник
0

В основном вы должны либо задать для size()для for-loop или итерация его, прося его итератора и использовать его в то время или делать-цикл. Используйте тот, который подходит для ваших целей.

В данной точке итератор знает, есть ли еще записи, и позволяет получить следующую, если она есть. Вы потом повторяете пока "больше записей?" выходит из строя.

См. Раздел «Обход коллекций» по адресу http://download.oracle.com/javase/tutorial/collections/interfaces/collection.html.


источник
Это не ответ на вопрос. Также крайне неэффективно использовать итератор для поиска последнего элемента в списке.
fishinear