Cách tốt nhất để nhận giá trị từ java.util.Collection theo chỉ mục là gì?Cách tốt nhất để nhận giá trị từ Bộ sưu tập theo chỉ mục
Trả lời
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)
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.
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?
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ự".
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ì.
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
Đ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
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());
}
Tôi đồng ý rằng đây thường là một ý tưởng tồi . Tuy nhiên, Commons Collections có một thói quen tốt để nhận được giá trị của chỉ số nếu bạn thực sự cần phải:
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ở.
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)
}
- 1. Bộ sưu tập sản phẩm Magento Chỉ nhận sản phẩm từ các danh mục nhất định
- 2. đếm giá trị chỉ truthy trong một bộ sưu tập
- 3. Cách nhận Tùy chọn từ chỉ mục trong Bộ sưu tập trong Scala?
- 4. LINQ để cập nhật bộ sưu tập với các giá trị từ một bộ sưu tập khác?
- 5. tìm mục trong bộ sưu tập có ngày gần nhất
- 6. Nhận các mục được lọc từ Bộ sưu tập
- 7. Làm cách nào để ghép hai bộ sưu tập theo chỉ mục trong LINQ
- 8. Cách tốt nhất để chuyển đổi bộ sưu tập phi chung chung thành một bộ sưu tập chung là gì?
- 9. Bộ sưu tập C# được lập chỉ mục theo thuộc tính?
- 10. Bộ sưu tập khóa/giá trị duy trì thứ tự
- 11. Cách tốt nhất để chuyển đổi một bộ sưu tập phi chung chung thành bộ sưu tập chung
- 12. cách tốt nhất để chuyển đổi bộ sưu tập thành chuỗi
- 13. Scala cách tốt nhất để chuyển Bộ sưu tập thành Bản đồ theo khóa? (2 biến thể)
- 14. Cách tốt nhất để sắp xếp bộ sưu tập trong một CompositeView
- 15. Bộ sưu tập có chỉ mục và truy cập băm
- 16. Cách tốt nhất để trả lại giá trị từ tập lệnh python
- 17. Bộ sưu tập Java - Khóa duy nhất và giá trị duy nhất
- 18. Scala: cách hợp nhất một bộ sưu tập Bản đồ
- 19. Java: Nhận mặt hàng đầu tiên từ bộ sưu tập
- 20. Cách tốt nhất để kiểm tra xem một Type là một bộ sưu tập
- 21. Bộ sưu tập ràng buộc WPF với chỉ mục
- 22. Ember.js: Làm cách nào để lấy giá trị chỉ mục trong khi lặp qua các mục của một bộ sưu tập bằng trình trợ giúp {{#each}}?
- 23. LINQ to Objects Tham gia hai bộ sưu tập để thiết lập giá trị trong bộ sưu tập đầu tiên
- 24. Tổng số mục trong bộ sưu tập
- 25. Hibernate: Cách tốt nhất để xóa các phần tử trong bộ sưu tập
- 26. Cách tốt nhất để tổ chức một bộ sưu tập lớn các tập lệnh cá nhân bằng git?
- 27. Lựa chọn nào tốt nhất để lập chỉ mục giá trị Boolean trong lucene?
- 28. Cách hợp nhất một bộ sưu tập các bộ sưu tập trong LINQ
- 29. Bộ sưu tập sửa đổi mục
- 30. Cảnh báo RestKit: "Tìm thấy một bộ sưu tập chỉ chứa giá trị NSNull ..."
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
@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