Mengapa API koleksi Java tidak memiliki metode terakhir? [Tutup]

19

Ini untuk koleksi yang dipesan misalnya java.util.List. Mengapa perancang bahasa tidak memasukkan metode terakhir? Satu-satunya alasan yang dapat saya pikirkan adalah:

  • ambiguitas ketika koleksi kosong (mengembalikan nol atau melempar pengecualian)
  • API mengasapi

Ada alasan lain?

tiga cangkir
sumber
9
+1 untuk banyaknya kali yang harus saya tulis collection.get(collection.size() - 1).
jprete
1
Mengapa tidak menulis kelas utilitas Anda sendiri yang memiliki metode ini, dan metode lain yang mungkin ingin Anda gunakan dengan koleksi?
Mahmoud Hossam
7
Tidak ada metode first (), jadi mengapa harus ada metode last ()?
Peter Taylor
6
@Peter urgh satu-satunya hal yang lebih buruk daripada tidak menerapkan getLast () adalah mengimplementasikannya dengan hack seperti get (-1).
Alb
2
@ Alb Saya kira "hack" ada di mata yang melihatnya :) Pada titik ini, saya menghargai sintaks -1 python. Tentu saja, jika Anda bertanya kepada saya lagi di masa depan atau di masa lalu, saya mungkin merasa persis seperti Anda.
tiga cangkir

Jawaban:

13

API mengasapi mungkin jawabannya. Dari pengalaman saya, satu-satunya saat saya membutuhkan fungsi ini, Antrian atau Stack adalah struktur data yang benar untuk pekerjaan yang memiliki metode yang sesuai.

Alb
sumber
Tebak Anda sebagian benar, tetapi jika Java didukung get(-1)untuk mengambil dari akhir daftar itu akan melakukan apa yang diinginkan OP tanpa menambahkan API mengasapi. Jawaban saya telah menarik downvotes yang tidak dapat dijelaskan.
user949300
1
Saya pikir jawaban yang lebih besar adalah bahwa kegagalan awal Java (berulang dalam. NET, dan masih berlangsung dalam kasus terakhir) untuk mendukung metode antarmuka standar berarti bahwa memiliki antarmuka termasuk anggota yang 99% implementasi akan menangani cara yang sama akan memaksakan kerja ekstra pada semua implementasi untuk kepentingan segelintir orang yang akan mengimplementasikannya secara berbeda.
supercat
16

suatu last()metode sama mudahnya list.get(list.size()-1), sama seperti tidak ada first()metode atau fifth()metode. Ini tidak sulit untuk disintesis dan merupakan spesialisasi. Anda juga bisa reverse()daftar dan list.get(0)yang akan memberikan lastitem. Hal-hal yang mudah dilakukan, biasanya tidak mendapatkan metode khusus mereka sendiri.

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));
    }
}

menghasilkan output berikut

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

itu juga lancang untuk menganggap bahwa segala sesuatu yang mengimplementasikan Listantarmuka sebenarnya memiliki konsep last()apa pun.


sumber
1
Akan lebih jelas dalam kedua kasus
Anto
Perhatikan bahwa metode size () mungkin tidak dapat menjawab jika koleksi belum terisi penuh.
1
.size()akan mengembalikan ukuran saat .size()-1ini masih akan menjadi elemen terakhir terlepas, bagaimana ia tahu apakah itu diisi penuh atau tidak?
1
Dengan spesifikasinya, Daftar dapat berisi lebih dari elemen Integer.MAX_VALUE, di mana ukuran case () mengembalikan Integer.MAX_VALUE, jadi .size()-1bukan cara yang sempurna untuk diterapkan last()(meskipun daftar besar seperti itu sangat tidak mungkin dan saya bertanya-tanya bagaimana daftar seperti itu) akan mengimplementasikan toArray()...)
user281377
1
C # memiliki metode .First & .Last. Membalik daftar hanya untuk mendapatkan item terakhir juga tidak terlalu efisien.
Carra
5

Yang java.util.LinkedListmendefinisikan getLast()dan getFirst()metode. Sayangnya metode ini tidak didefinisikan di salah satu antarmuka itu, jadi Anda harus menggunakan tipe LinkedList. Jika Anda hanya tertarik pada elemen terakhir, Anda dapat mempertimbangkan untuk menggunakan metode java.util.Queueantarmuka peek(). LinkedList mengimplementasikan Antrian.

René Link
sumber
0

Pada dasarnya Anda juga harus meminta size()untuk for-loop atau iterate itu dengan meminta iterator dan menggunakannya sementara atau melakukan loop. Gunakan yang cocok untuk tujuan Anda.

Iterator tahu pada titik tertentu jika ada lebih banyak entri dan memungkinkan Anda untuk mendapatkan yang berikutnya jika ada. Anda kemudian ulangi hingga "lebih banyak entri?" gagal

Lihat bagian "Melintasi Koleksi" di http://download.oracle.com/javase/tutorial/collections/interfaces/collection.html


sumber
Ini bukan jawaban untuk pertanyaan itu. Juga sangat tidak efisien untuk menggunakan iterator untuk menemukan elemen terakhir dalam daftar.
Fishinear