2012-03-30 32 views
6

Rõ ràng, bộ không có bất kỳ loại đặt hàng, vì vậy tôi không thể mong đợi bất kỳ đặt hàng cụ thể nếu tôi làmĐịnh nghĩa "toArray" của một tập hợp?

String[] string = mySet.toArray(); 

Tuy nhiên, tôi đang phải đối mặt với một trường hợp sử dụng mà tôi không quan tâm những gì lệnh áp dụng các mảng chuỗi là trong, nhưng tôi DO cần nó để được các trường hợp đó nếu hai bộ đều bình đẳng với nhau, sau đó:

StringUtils.join(mySet.toArray(),','); 

sẽ tạo ra chuỗi chính xác tương tự cho những bộ, luôn luôn, bất kể bao nhiêu lần tôi chạy chương trình giả sử tôi gắn bó với cùng một mã.

Tôi có đảm bảo này không?

Tương tự, điều này có đúng với thứ tự mà các phần tử xuất hiện cho một Tập hợp nhất định trong một trình lặp không?

+2

Một bên: "Java" không phải là từ viết tắt. – bernie

+1

Bộ có thể đặt hàng. Ví dụ TreeSet. – kukudas

+0

@kukudas Tôi thực sự nghĩ rằng "không đặt hàng" là một trong những yêu cầu không thực tế của một bộ. Cảm ơn! – Jeremy

Trả lời

4

Về mặt kỹ thuật, bạn không có bảo đảm. Set là Giao diện. Việc triển khai sẽ thay đổi và có thể hoặc có thể không tuân theo yêu cầu này.

Buộc sự cố bằng cách tự sắp xếp mảng sau khi trích xuất kết quả từ Tập hợp.

+0

Cảm ơn. Tất cả các câu trả lời tuyệt vời ở đây (upvoted tất cả chúng) nhưng điều này cho một giải pháp rõ ràng. Tôi sẽ "ép buộc vấn đề." – Jeremy

7

Nói chung, bạn không thể đảm bảo thứ tự của Set như bạn đã đề cập, vì vậy ngay cả khi nó hoạt động ngay bây giờ, nó có thể không hoạt động trong tương lai. Tuy nhiên, bạn có thể đảm bảo thứ tự của LinkedHashSet để bạn có thể sử dụng nó. Điều này chỉ hoạt động nếu các bộ có các phần tử được chèn vào cùng một thứ tự mặc dù. Nếu bạn không có tình huống đó, bạn có thể chỉ cần sắp xếp các thiết lập và in nó.

4

Không, hoàn toàn không. Đối với một ví dụ nhỏ, xem xét:

LinkedHashSet<String> set1 = new LinkedHashSet<String>(); 
set1.add("x"); 
set1.add("y"); 

LinkedHashSet<String> set2 = new LinkedHashSet<String>(); 
set2.add("y"); 
set2.add("x"); 

Hai bộ đều bình đẳng, nhưng vì LinkedHashSet giữ gìn trật tự chèn, nó đảm bảo rằng vòng lặp của họ sẽ trở về giá trị theo một thứ tự khác nhau - và tôi mong đợi toArray để có cùng hiệu ứng.

2

Bạn không có bảo đảm này. Có thể bạn sẽ luôn thấy tác phẩm này, bởi vì tôi nghi ngờ rằng hầu hết việc triển khai Set.toArray() sẽ tạo ra cùng một thứ tự cho các bộ bằng nhau, nhưng bạn không thể dựa vào điều này.

Bạn cũng không thể dựa vào thứ tự từ trình lặp.

Bộ hoàn toàn và không bị sắp xếp hoàn toàn. Bạn có thể, do hành vi thực hiện, nhận được một cái gì đó trông giống như một trật tự nhất quán trong số họ, nhưng điều này không phải là trong bất kỳ cách nào để được dựa vào.

3

Điều đó sẽ hoàn toàn phụ thuộc vào việc triển khai Set. Set là một giao diện, không phải là một lớp và toArray() không đảm bảo bất kỳ điều gì ngoại trừ nó phải khớp với Iterator của thực hiện.

Từ javadoc cho Set.toArray():

Nếu đặt điều này làm cho bất kỳ sự bảo đảm như những gì đặt yếu tố của nó được trả về bởi iterator của nó, phương pháp này phải trả lại các yếu tố theo thứ tự.

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