Tại sao các bộ sưu tập API API không có phương thức cuối cùng? [đóng cửa]


19

Điều này là cho các bộ sưu tập được đặt hàng, ví dụ java.util.List. Tại sao các nhà thiết kế ngôn ngữ không bao gồm một phương pháp cuối cùng? Những lý do duy nhất tôi có thể nghĩ đến là:

  • sự mơ hồ khi bộ sưu tập trống (trả về null hoặc ném ngoại lệ)
  • API phình to

Còn lý do nào khác không?


9
+1 cho số lần tuyệt đối mà tôi phải viết collection.get(collection.size() - 1).
jprete

1
Tại sao không viết lớp tiện ích của riêng bạn có phương thức này và bất kỳ phương thức nào khác bạn có thể muốn sử dụng với các bộ sưu tập?
Mahmoud Hossam

7
Không có phương thức đầu tiên (), vậy tại sao nên có phương thức () cuối cùng?
Peter Taylor

6
@Peter urgh điều duy nhất tệ hơn là không triển khai getLast () là triển khai nó với một bản hack như get (-1).
Alb

2
@Alb Tôi đoán "hack" là trong mắt của kẻ si tình :) Tại thời điểm này, tôi đánh giá cao cú pháp -1 của python. Tất nhiên, nếu bạn hỏi tôi một lần nữa trong tương lai hoặc trong quá khứ, tôi có thể cảm thấy chính xác như bạn làm.
ba cốc

Câu trả lời:


13

API bloat có lẽ là câu trả lời. Theo kinh nghiệm của tôi, lần duy nhất tôi cần chức năng này, Hàng đợi hoặc Ngăn xếp là cấu trúc dữ liệu chính xác cho công việc có phương thức phù hợp.


Đoán bạn đúng một phần, nhưng nếu Java được hỗ trợ get(-1)để truy xuất từ ​​cuối danh sách, nó sẽ làm những gì OP muốn mà không cần thêm API bloat. Câu trả lời của tôi như vậy đã thu hút downvote không giải thích được.
dùng949300

1
Tôi nghĩ rằng một câu trả lời lớn hơn là thất bại ban đầu của Java (lặp lại trong .NET và vẫn đang tiếp diễn trong trường hợp sau) để hỗ trợ các phương thức giao diện mặc định có nghĩa là có các giao diện bao gồm một thành viên mà 99% việc triển khai sẽ xử lý theo cách tương tự sẽ áp đặt công việc bổ sung trên tất cả các triển khai vì lợi ích của số ít sẽ thực hiện chúng khác nhau.
supercat

16

một last()phương thức cũng dễ như vậy list.get(list.size()-1), giống như không có first()phương pháp hay fifth()phương thức nào. Nó không khó để tổng hợp và là một chuyên môn. Bạn cũng có thể reverse()danh sách và list.get(0)sẽ cung cấp các lastmục. Những việc dễ làm, thường không có phương pháp chuyên biệt của riêng họ.

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

kết quả trong đầu ra sau

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

cũng có thể cho rằng mọi thứ thực hiện Listgiao diện thực sự có khái niệm về last()bất cứ thứ gì.


1
Nó sẽ rõ ràng hơn trong cả hai trường hợp
Anto

Lưu ý rằng phương thức size () có thể không trả lời được nếu bộ sưu tập chưa được điền đầy đủ.

1
.size()sẽ trả về kích thước hiện tại .size()-1vẫn sẽ là phần tử cuối cùng bất kể, làm thế nào để biết nó có được điền đầy đủ hay không?

1
Theo đặc tả, Danh sách có thể chứa nhiều hơn các phần tử Integer.MAX_VALUE, trong đó kích thước trường hợp () trả về Integer.MAX_VALUE, vì vậy .size()-1không phải là cách hoàn hảo để thực hiện last()(mặc dù danh sách lớn như vậy rất khó xảy ra và tôi tự hỏi làm thế nào một danh sách như vậy sẽ triển khai toArray()...)
user281377

1
C # không có phương thức .irst & .Last. Đảo ngược một danh sách chỉ để có được mục cuối cùng cũng không thực sự hiệu quả.
Carra

5

Các java.util.LinkedListđịnh nghĩa getLast()getFirst()phương thức. Thật không may, các phương thức này không được xác định trong một trong các giao diện của nó, vì vậy bạn phải sử dụng loại LinkedList. Nếu bạn chỉ quan tâm đến yếu tố cuối cùng, bạn có thể cân nhắc sử dụng phương thức java.util.Queuecủa giao diện peek(). LinkedList thực hiện Hàng đợi.


0

Về cơ bản, bạn phải yêu cầu size()một for-loop hoặc lặp lại nó bằng cách yêu cầu trình lặp của nó và sử dụng nó trong một thời gian hoặc vòng lặp do. Sử dụng một trong những phù hợp cho mục đích của bạn.

Trình vòng lặp biết tại một điểm nhất định nếu có nhiều mục nhập hơn và cho phép bạn có được mục tiếp theo nếu có. Sau đó, bạn lặp lại cho đến khi "nhiều mục?" thất bại

Xem phần "Truy cập bộ sưu tập" tại http://doad.oracle.com/javase/tutorial/collections/interfaces/collection.html


Đây không phải là một câu trả lời cho câu hỏi. Nó cũng cực kỳ không hiệu quả khi sử dụng một trình vòng lặp để tìm phần tử cuối cùng trong danh sách.
câu cá
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.