2009-06-26 28 views

Trả lời

2

Chuyển đổi bộ sưu tập thành một mảng bằng cách sử dụng chức năng Object [] toArray (Object [] a)

17

Nói chung, không có cách nào tốt, như Collection s không đảm bảo có chỉ số cố định. Có, bạn có thể lặp qua chúng, đó là cách toArray (và các hàm khác) hoạt động. Nhưng thứ tự lặp lại không nhất thiết phải cố định, và nếu bạn đang cố gắng lập chỉ mục vào một Bộ sưu tập chung, có thể bạn đang làm điều gì sai. Sẽ có ý nghĩa hơn khi lập chỉ mục thành một số List.

46

Bạn không nên. a Collection tránh nói về chỉ mục cụ thể bởi vì nó có thể không có ý nghĩa đối với bộ sưu tập cụ thể. Ví dụ: List ngụ ý một số hình thức đặt hàng, nhưng Set thì không.

Collection<String> myCollection = new HashSet<String>(); 
    myCollection.add("Hello"); 
    myCollection.add("World"); 

    for (String elem : myCollection) { 
     System.out.println("elem = " + elem); 
    } 

    System.out.println("myCollection.toArray()[0] = " + myCollection.toArray()[0]); 

mang lại cho tôi:

elem = World 
    elem = Hello 
    myCollection.toArray()[0] = World 

Trong khi:

myCollection = new ArrayList<String>(); 
    myCollection.add("Hello"); 
    myCollection.add("World"); 

    for (String elem : myCollection) { 
     System.out.println("elem = " + elem); 
    } 

    System.out.println("myCollection.toArray()[0] = " + myCollection.toArray()[0]); 

mang lại cho tôi:

elem = Hello 
    elem = World 
    myCollection.toArray()[0] = Hello 

Tại sao bạn muốn làm điều này? Bạn có thể không chỉ lặp qua bộ sưu tập?

+0

Hi @butterchicken, trường hợp của tôi là tôi sử dụng một LinkedHashMap nơi tôi nhận được keyset (mà là một Set ). Tôi tìm thấy bài đăng này: http://stackoverflow.com/questions/2923856/is-the-order-guaranteed-for-the-return-of-keys-and-values-from-a-linkedhashmap-o rằng thứ tự bên trong Bộ này được đảm bảo. Tôi có nên vẫn không công khai về nó? – jobbert

+1

@jobbert Bạn hoàn toàn có thể lặp lại nó. Bạn nhận được một 'Set' trở lại trong trường hợp này bởi vì đó là hợp đồng của giao diện của' Bản đồ'. – butterchicken

4

Bạn phải quấn bộ sưu tập của mình vào danh sách (new ArrayList(c)) hoặc sử dụng c.toArray() vì Bộ sưu tập không có khái niệm "chỉ mục" hoặc "thứ tự".

14

Tôi đồng ý với câu trả lời Matthew Flaschen 's và chỉ muốn hiển thị ví dụ về các tùy chọn đối với trường hợp bạn không thể chuyển vào danh sách (vì một lợi nhuận thư viện bạn một Bộ sưu tập):

List list = new ArrayList(theCollection); 
list.get(5); 

Hoặc

Object[] list2 = theCollection.toArray(); 
doSomethingWith(list[2]); 

Nếu bạn biết Generics là gì tôi cũng có thể cung cấp mẫu cho nó.

Chỉnh sửa: Đó là một câu hỏi khác về ý định và ngữ nghĩa của bộ sưu tập gốc là gì.

+1

Nếu hàm thư viện trả về một Bộ sưu tập, thì tôi không nghĩ bạn có bất kỳ sự bảo đảm nào về thứ tự các phần tử bên trong bộ sưu tập đó. Có lẽ cuộc gọi thư viện trả về một Bộ sưu tập chính xác bởi vì nó không muốn bạn thực hiện các loại giả định này? – butterchicken

+0

Điểm tốt. OP không chia sẻ đủ thông tin về loại thư viện anh ta đang sử dụng. Một số thư viện trả về Bộ sưu tập chỉ vì nhà phát triển đọc về một phương pháp hay nhất để trả lại một số giao diện siêu thay vì triển khai cụ thể. Thư viện chỉ có thể trả về Iterable nếu không bao giờ có ý định cho phép bất cứ điều gì khác ngoài việc lặp lại kết quả (như trong AXIOM). – akarnokd

1

bạn dứt khoát muốn có một List:

danh sách giao diện cung cấp bốn phương pháp cho vị trí truy cập (lập chỉ mục) để liệt kê các yếu tố. Danh sách (như các mảng Java) không dựa trên.

Cũng

Lưu ý rằng các hoạt động này có thể thực hiện trong thời gian tương ứng với giá trị chỉ số cho một số triển khai (lớp LinkedList, ví dụ). Do đó, việc lặp qua các phần tử trong danh sách> thường thích hợp hơn để lập chỉ mục thông qua nó nếu người gọi không biết thực hiện .

Nếu bạn cần chỉ số để chỉnh sửa bộ sưu tập của bạn, bạn nên lưu ý Danh sách mà cung cấp một đặc biệt ListIterator cho phép bạn để có được chỉ số:

List<String> names = Arrays.asList("Davide", "Francesco", "Angelocola"); 
    ListIterator<String> i = names.listIterator(); 

    while (i.hasNext()) { 
     System.out.format("[%d] %s\n", i.nextIndex(), i.next()); 
    } 
1

Nó sẽ chỉ là thuận tiện để chỉ đơn giản là chuyển đổi bộ sưu tập của bạn thành một danh sách bất cứ khi nào nó cập nhật. Nhưng nếu bạn đang khởi tạo, điều này sẽ đủ:

 for(String i : collectionlist){ 
     arraylist.add(i); 
     whateverIntID = arraylist.indexOf(i); 
    } 

Hãy cởi mở.

0

sử dụng cho mỗi vòng lặp ...

ArrayList<Character> al=new ArrayList<>(); 

String input="hello"; 

for(int i=0;i<input.length();i++){ 
      al.add(input.charAt(i)); 
     } 

     for (Character ch : al) { 

      System.Out.println(ch) 

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