Чому API колекцій Java не має останнього методу? [зачинено]


19

Це для замовлених колекцій, наприклад, java.util.List. Чому дизайнери мови не включили останній метод? Єдині причини, про які я можу подумати:

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

Будь-які інші причини?


9
+1 за рівну кількість разів, яку мені доводилося писати collection.get(collection.size() - 1).
jprete

1
Чому б не написати власний клас утиліти, який має цей метод, та будь-який інший метод, який ви можете використовувати з колекціями?
Махмуд Хоссам

7
Не існує також першого () методу, тож чому повинен бути останній () метод?
Пітер Тейлор

6
@Peter urgh, єдине гірше, ніж не реалізувати getLast () - це реалізувати його з таким хаком, як get (-1).
Альб

2
@Alb Я здогадуюсь, що "хак" знаходиться в очах глядача :) На даний момент я ціную синтаксис python -1. Звичайно, якщо ви запитаєте мене ще раз у майбутньому чи в минулому, я можу почуватись точно так само, як і ви.
три чашки

Відповіді:


13

API роздуття, ймовірно, відповідь. З мого досвіду, єдиний раз, коли мені знадобилася ця функціональність, черга або стек - це правильна структура даних для роботи, що має відповідний метод.


Здається, ви частково правильні, але якщо Java підтримує get(-1)отримання з кінця списку, вона зробить те, що хотіла ОП, не додаючи інтерфейс API. Моя відповідь як така накреслила незрозумілі голоси.
user949300

1
Я думаю, що більша відповідь полягає в тому, що початковий збій Java (повторюється в .NET, і все ще триває в останньому випадку) щодо підтримки методів інтерфейсу за замовчуванням означав, що наявність інтерфейсів включає член, який 99% реалізацій буде обробляти так само, накладе додаткову роботу на всіх реалізаціях на користь кількох, хто реалізував би їх по-різному.
supercat

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, у цьому випадку розмір () повертає Integer.MAX_VALUE, тому .size()-1це не ідеальний спосіб реалізації last()(хоча такий великий список дуже малоймовірний, і мені цікаво, як такий список буде реалізовувати toArray()...)
user281377

1
У C # є метод. First & .Last. Зміна списку лише для отримання останнього пункту теж не є ефективною.
Carra

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


Це не відповідь на запитання. Також вкрай неефективно використовувати ітератор, щоб знайти останній елемент у списку.
рибалкапоруч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.