2008-10-08 37 views
6

Tôi cảm thấy rất thất vọng vì dường như tôi không thể hiểu tại sao Bộ sưu tập xáo trộn không hoạt động đúng cách.Sử dụng API bộ sưu tập để xáo trộn

Cho phép nói rằng tôi đang cố gắng phát ngẫu nhiên mảng randomizer.

int[] randomizer = new int[] {200,300,212,111,6,2332}; 
Collections.shuffle(Arrays.asList(randomizer)); 

Vì lý do nào đó, các yếu tố vẫn được sắp xếp chính xác cho dù tôi có gọi phương thức trộn hay không. Ý tưởng nào?

+0

Cũng thấy [trùng lặp này] (http://stackoverflow.com/questions/3981420/collections-shuffle) – basZero

Trả lời

18

Arrays.asList không thể được sử dụng với các mảng nguyên thủy. Sử dụng điều này thay vì:

Integer[] randomizer = new Integer[] {200,300,212,111,6,2332}; 
Collections.shuffle(Arrays.asList(randomizer)); 

Nguyên tắc này cũng áp dụng đối với hầu hết các lớp học trong khuôn khổ bộ sưu tập, trong đó bạn không thể sử dụng các loại nguyên thủy.

Mã gốc (với int[]) biên soạn tốt, nhưng đã không làm việc như mong muốn, vì hành vi của các phương pháp variadic asList: nó chỉ làm cho một danh sách một phần tử, với các mảng int như thành viên duy nhất của nó.

+0

bắt tốt! Tôi đã suy nghĩ vấn đề là danh sách sẽ được sắp xếp, nhưng không phải là mảng ban đầu, nhưng các javadocs trong Arrays.asList nói rằng danh sách sử dụng mảng cơ bản. Nếu bạn phát triển danh sách này, bạn sẽ gặp vấn đề! (mảng sẽ được thay thế bằng mảng mới) –

+0

cảm ơn bạn đã giải thích rõ ràng – VeePee

+0

Đáng yêu ... trường hợp khác trong đó Tự động/Bỏ hộp không hoạt động như mong đợi (hoặc trong trường hợp này, không áp dụng). –

0

Câu trả lời của Chris là chính xác.

Như tôi đã nói trong nhận xét về câu trả lời của Chris, mảng cơ bản của bạn sẽ thay đổi một cách thích hợp trừ khi danh sách cần phát triển và danh sách tạo một danh sách mới và sao chép các mục vào đó.

Bạn có thể muốn giữ một tham chiếu đến danh sách và lặp lại điều đó sau cuộc gọi Arrays.asList, và không lặp qua mảng sau đó, lặp qua Danh sách thay thế.

+0

Trong khi câu trả lời của tôi là chính xác, thật không may, bạn thì không. :-(Danh sách được trả về từ 'Arrays.asList' là kiểu' java.util.Arrays $ ArrayList', và không giống như 'java.util.ArrayList', không được resizeable (một' UnsupportedOperationException' được ném nếu bạn cố gắng). Vì vậy, danh sách trả về là _always_ được hỗ trợ bởi mảng đã cho. –

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