2012-06-25 34 views
13

Trong Iterator Mặt trời đã thêm phương thức xóa để xóa phần tử được truy cập lần cuối của bộ sưu tập. Tại sao không có phương thức thêm để thêm phần tử mới vào bộ sưu tập? Những loại tác dụng phụ nào có thể có đối với bộ sưu tập hoặc vòng lặp?lý do tại sao không có phương thức thêm trong giao diện Iterator

+0

Tôi nghĩ rằng bạn có một sự trùng lặp: http://stackoverflow.com/questions/993025/java-adding-elements-to-a-collection-during-iteration – mihaisimi

+0

@mihaisimi - không có, đây là thực sự là một câu hỏi khác. –

+0

Có, bạn đã đúng. Vẫn coobird cung cấp một câu trả lời tốt cho điều này trên chủ đề đó. – mihaisimi

Trả lời

10

Mục đích duy nhất của Iterator là liệt kê thông qua bộ sưu tập. Tất cả các bộ sưu tập đều chứa phương thức add() để phục vụ mục đích của bạn. Sẽ không có điểm khi thêm vào một Iterator vì bộ sưu tập có thể hoặc không thể được đặt hàng (trong trường hợp của HashSet).

EDIT: Trong khi làm việc trên một vấn đề khác, tôi đưa ra một lý do khác là Iterator thiếu phương thức add(). Nhìn dưới mui xe của ArrayList (dòng 111), và HashMap (dòng 149), chúng ta thấy rằng việc thực hiện chỉ là một vài phương pháp xung quanh một mảng các đối tượng. Bây giờ chúng ta xem xét cách mảng được xử lý trong bộ nhớ.

zero-based array indexes

Đây là một mảng gồm 5 phần tử. Tuy nhiên, có sáu chỉ số. Chữ "a" trong mảng này được liệt kê là phần tử 0 vì để đọc nó, từ trái sang phải giống như máy tính, bạn phải bắt đầu từ chỉ mục 0. Bây giờ, nếu chúng ta lặp qua mảng này (có, bộ sưu tập, nhưng nó sẽ chuyển thành một mảng), chúng ta sẽ bắt đầu từ chỉ số 0 và tiếp tục chỉ mục 1. Tại thời điểm này trong Iterator, chúng ta muốn gọi add("f");. Tại thời điểm này, hãy so sánh ý nghĩa của add()remove(). remove() sẽ để lại một khoảng trống trong mảng, dễ nhảy qua, bởi vì chúng ta có thể ngay lập tức nhận ra rằng nó không phải là một thành viên. Mặt khác, add() sẽ đặt một yếu tố mới mà trước đây không có. Điều này sẽ ảnh hưởng đến độ dài của mảng mà chúng tôi đang lặp qua. Điều gì sẽ xảy ra khi chúng ta đến được phần tử cuối cùng đó? Thậm chí chúng tôi có thể đảm bảo rằng nó có (có nghĩa là mảng đó không vượt quá the maximum size)?

Tất cả trong tất cả, các đối số theo cách này hay cách khác đều có điểm hợp lệ, nhưng dòng dưới cùng là hành vi của phương pháp add() không được xác định rõ trong mọi trường hợp. Sun đã phải lựa chọn nơi để hạn chế chức năng, và họ đã chọn không bao gồm phương pháp này.

+0

"bởi vì bộ sưu tập có thể hoặc không thể được đặt hàng" - bạn có thể xây dựng nó một chút không. Cảm ơn – droidsites

+0

Tôi đã nhận được tuyên bố của bạn :-). Cảm ơn – droidsites

+0

Một HashSet không bảo đảm cho thứ tự các thành viên của nó. Nếu bạn đang lặp qua nó để cố gắng tìm một điểm mà tại đó để chèn một giá trị, bạn vừa đánh bại điểm của một Iterator. – gobernador

0

Tôi không thể nghĩ ra bất kỳ lý do lý thuyết nào tại sao add() không thể được bao gồm trong Iterator. Cũng giống như Iterator có thể cho phép các thành phần bị xóa khỏi bộ sưu tập thông qua chính nó, nó có thể được thiết kế để xử lý các phần tử được thêm vào theo cùng một cách.

Nhưng tôi sẽ nói rằng trong tất cả các năm lập trình của tôi trong Java - trên 15! - Tôi chưa bao giờ muốn có phương thức Iterator.add(). Vì vậy, tôi nghi ngờ nó chỉ đơn giản là không phải tất cả những gì hữu ích.

5

Nếu bạn đang làm việc trên danh sách, bạn có thể sử dụng ListIterator cung cấp cả thao tác thêm và xóa.

+3

Không trả lời câu hỏi này. Nhưng có, 'Iterator' không thực hiện' add' bởi vì nó không phải 'ListIterator'. – Robert

10

Được rồi, ở đây chúng tôi đi:

Câu trả lời được nêu rõ trong faq thiết kế:

Tại sao bạn không cung cấp một phương pháp Iterator.add?

Ngữ nghĩa không rõ ràng, với điều kiện hợp đồng cho Iterator không đảm bảo về thứ tự lặp lại. Tuy nhiên, lưu ý rằng ListIterator cung cấp một hoạt động bổ sung, vì nó đảm bảo thứ tự của phép lặp.

http://docs.oracle.com/javase/1.4.2/docs/guide/collections/designfaq.html#10

0

Iterator chỉ trỏ đến phần tử tiếp theo. nơi ListIterator có con trỏ đến phần tử trước đó (nhớ, nó có thể đi ngược).

Các vấn đề liên quan