ทำไม API การรวบรวม Java จึงไม่มีวิธีสุดท้าย [ปิด]


19

นี่สำหรับคอลเลกชันที่ได้รับคำสั่งเช่น java.util.List ทำไมนักออกแบบภาษาจึงไม่มีวิธีสุดท้าย เหตุผลเดียวที่ฉันนึกได้คือ:

  • ความกำกวมเมื่อการรวบรวมว่างเปล่า (ส่งคืนโมฆะหรือโยนข้อยกเว้น)
  • API bloat

มีเหตุผลอื่นอีกไหม?


9
+1 collection.get(collection.size() - 1)สำหรับจำนวนของครั้งที่ผมเคยเขียน
jprete

1
ทำไมไม่เขียนคลาสยูทิลิตี้ของคุณเองที่มีวิธีนี้และวิธีอื่น ๆ ที่คุณอาจต้องการใช้กับคอลเลกชัน?
Mahmoud Hossam

7
ไม่มีวิธีแรก () เช่นกันทำไมจึงควรมีวิธีสุดท้าย ()
ปีเตอร์เทย์เลอร์

6
@ ปีเตอร์สิ่งเดียวที่เลวร้ายยิ่งกว่าการไม่ใช้ getLast () คือการนำไปใช้กับแฮ็กอย่าง get (-1)
Alb

2
@Alb ฉันเดาว่า "แฮ็ค" อยู่ในสายตาของคนดู :) ณ เวลานี้ฉันขอขอบคุณไวยากรณ์ -1 ของไพ ธ อน แน่นอนถ้าคุณถามฉันอีกครั้งในอนาคตหรือในอดีตฉันอาจรู้สึกเหมือนกับคุณ
สามถ้วย

คำตอบ:


13

API bloat น่าจะเป็นคำตอบ จากประสบการณ์ของฉันเพียงครั้งเดียวที่ฉันต้องการฟังก์ชั่นนี้ Queue หรือ Stack เป็นโครงสร้างข้อมูลที่ถูกต้องสำหรับงานที่มีวิธีการที่เหมาะสม


เดาว่าคุณถูกต้องเพียงบางส่วน แต่ถ้า Java รองรับget(-1)การดึงจากส่วนท้ายของรายการมันจะทำในสิ่งที่ OP ต้องการโดยไม่ต้องเพิ่ม API bloat คำตอบของฉันเช่นนี้ได้วาด downvotes ไม่ได้อธิบาย
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
มันจะชัดเจนขึ้นในทั้งสองกรณีแม้ว่า
Anto

โปรดทราบว่าวิธีการ size () อาจไม่สามารถตอบได้หากคอลเลกชันยังไม่ได้รับการเติมเต็ม

1
.size()จะส่งคืนขนาดปัจจุบัน.size()-1จะยังคงเป็นองค์ประกอบสุดท้ายโดยไม่คำนึงว่าจะทราบได้อย่างไรว่ามีประชากรเต็มหรือไม่

1
ตามข้อกำหนดรายการสามารถมีองค์ประกอบได้มากกว่า Integer.MAX_VALUE ซึ่งขนาดกรณี () จะคืนค่า Integer.MAX_VALUE ดังนั้นจึง.size()-1ไม่ใช่วิธีที่สมบูรณ์แบบในการนำไปใช้last()(แม้ว่ารายการขนาดใหญ่เช่นนี้จะไม่ค่อยน่าสนใจ จะใช้toArray()... )
281377

1
C # มี. วิธีแรกและ. สุดท้าย การย้อนกลับรายการเพื่อให้ได้รับรายการสุดท้ายนั้นไม่มีประสิทธิภาพเช่นกัน
Carra

5

การjava.util.LinkedListกำหนดgetLast()และgetFirst()วิธีการ น่าเสียดายที่วิธีการเหล่านี้ไม่ได้กำหนดไว้ในอินเทอร์เฟซตัวใดตัวหนึ่งดังนั้นคุณต้องใช้ชนิด LinkedList หากคุณสนใจเฉพาะองค์ประกอบสุดท้ายคุณอาจพิจารณาใช้วิธีการjava.util.Queueของส่วนต่อประสาน peek()LinkedList ใช้คิว


0

โดยทั่วไปคุณต้องขอsize()a for-loop หรือวนซ้ำโดยขอ iterator และใช้มันในขณะที่หรือ do-loop ใช้อันที่เหมาะสมกับจุดประสงค์ของคุณ

ตัววนซ้ำรู้ ณ จุดที่กำหนดหากมีรายการมากขึ้นและอนุญาตให้คุณรับสิ่งต่อไปถ้ามี คุณทำซ้ำจนกระทั่ง "มีรายการเพิ่มเติมหรือไม่" ล้มเหลว

ดูหัวข้อ "Traversing Collections" ที่http://download.oracle.com/javase/tutorial/collections/interfaces/collection.html


นี่ไม่ใช่คำตอบสำหรับคำถาม นอกจากนี้ยังไม่มีประสิทธิภาพอย่างยิ่งในการใช้ตัววนซ้ำเพื่อค้นหาองค์ประกอบสุดท้ายในรายการ
fishinear
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.