Java koleksiyon API'larının neden son bir yöntemi yok? [kapalı]


19

Bu, java.util.List gibi sıralı koleksiyonlar içindir. Dil tasarımcıları neden son bir yöntem içermiyordu? Düşünebilmemin tek nedeni:

  • koleksiyon boş olduğunda belirsizlik (null döndür veya istisna at)
  • API şişmesi

Başka nedenleri var mı?


9
Yazmam gereken sayıda +1 collection.get(collection.size() - 1).
jprete

1
Neden bu yönteme sahip kendi yardımcı sınıfınızı ve koleksiyonlarla kullanmak isteyebileceğiniz başka bir yöntemi yazmıyorsunuz?
Mahmoud Hossam

7
Bir first () yöntemi de yok, o zaman neden last () yöntemi olmalı?
Peter Taylor

6
@Peter urgh getLast () uygulamadan daha kötü olan tek şey get (-1) gibi bir hack ile uygulamaktır.
Alb

2
@Alb Sanırım "hack" seyirci gözündedir :) Bu noktada, python -1 -1 sözdizimi için teşekkür ederiz. Tabii ki, bana gelecekte ya da geçmişte bir kez daha sorarsanız, tam olarak sizin gibi hissedebilirim.
üç bardak

Yanıtlar:


13

API şişkinliği muhtemelen cevaptır. Deneyimlerime göre, bu işlevselliğe ihtiyacım olan tek zaman bir Kuyruk veya Yığın, uygun yönteme sahip olan iş için doğru veri yapısı idi.


Kısmen doğru olduğunu tahmin edin, ancak Java get(-1)bir listenin sonundan almayı destekliyorsa , OP'nin API bloat eklemeden istediğini yapardı. Benim cevabım açıklanamayan inişler yaptı.
user949300

1
Daha büyük bir cevap, Java'nın varsayılan arayüz yöntemlerini desteklemek için ilk kez (.NET'te yinelenen ve hala devam eden) başarısızlığının, arabirimlerin sahip olmasının, uygulamaların% 99'unun aynı şekilde işleyeceği bir üye içerdiği anlamına geldiğini düşünüyorum. üzerinde tüm farklı şekilde yerine getireceğini ifade kaç yararına uygulamaları.
supercat

16

bir last()yöntem, tıpkı bir yöntem ya da yöntem list.get(list.size()-1)olmadığı kadar kolaydır . Sentezlemek o kadar da zor değil ve bir uzmanlık alanı. Ayrıca listeyi ve hangi öğeyi verecektir . Yapması kolay şeyler, genellikle kendi özel yöntemlerini almazlar.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));
    }
}

aşağıdaki çıktıyla sonuçlanır

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

Listarabirimi uygulayan her şeyin aslında bir last()şey kavramına sahip olduğunu varsaymak da küstahtır .


1
Her iki durumda da daha açık olurdu
Anto

Koleksiyon henüz tam olarak doldurulmamışsa size () yönteminin yanıt veremeyebileceğini unutmayın.

1
.size()mevcut boyutu döndürecek .size()-1olursa olsun, yine de tam olarak doldurulup doldurulmadığını nasıl bilebilir?

1
Spesifikasyona göre, bir Liste Integer.MAX_VALUE öğesinden daha fazlasını içerebilir, bu durumda size () Integer.MAX_VALUE .size()-1değerini döndürür, bu yüzden uygulamak için mükemmel bir yol değildir last()(bu kadar büyük bir liste çok olası değildir ve böyle bir listenin nasıl olduğunu merak ediyorum uygulamak toArray()...)
user281377

1
C # bir .First & .Last yöntemi var. Sadece son öğeyi almak için bir listeyi tersine çevirmek de tam olarak verimli değildir.
Carra

5

java.util.LinkedListTanımlar getLast()ve getFirst()yöntemler. Ne yazık ki bu yöntemler arayüzlerinden birinde tanımlanmamıştır, bu yüzden LinkedList türünü kullanmanız gerekir. Yalnızca son öğeyle ilgileniyorsanız, java.util.Queuearabirimin peek()yöntemini kullanmayı düşünebilirsiniz . LinkedList, Kuyruğu uygular.


0

Temel olarak ya size()bir for-loop istemeniz ya da yineleyicisini sorarak yinelemeniz ve bir süre ya da do-loop kullanmanız gerekir. Amacınıza uygun olanı kullanın.

Yineleyici belirli bir noktada daha fazla giriş olup olmadığını bilir ve varsa bir sonrakini almanızı sağlar. Daha sonra tekrar "giriş daha?" başarısız olur.

Http://download.oracle.com/javase/tutorial/collections/interfaces/collection.html adresindeki "Koleksiyonların Geçişi" bölümüne bakın.


Bu sorunun cevabı değil. Ayrıca listedeki son öğeyi bulmak için yineleyici kullanmak son derece verimsizdir.
balıkçılarKas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.