Làm cách nào tôi có thể lặp qua các mục của một mục LinkedHashSet
từ mục cuối cùng đến mục đầu tiên?Java LinkedHashSet chuyển tiếp ngược
Trả lời
Nếu bạn muốn tiếp tục sử dụng các bộ sưu tập, bạn có thể sử dụng như sau:
LinkedHashSet<T> set = ...
LinkedList<T> list = new LinkedList<>(set);
Iterator<T> itr = list.descendingIterator();
while(itr.hasNext()) {
T item = itr.next();
// do something
}
Nếu bạn đang sử dụng tốt với việc sử dụng một mảng thay vào đó, bạn có thể xem hvgotcodes' answer.
er, giả sử bạn có nghĩa là LinkedHashSet ...
Tôi sẽ sử dụng toArray và chỉ sử dụng một đảo ngược vòng lặp for.
Có thể có cách tốt hơn để làm điều đó, nhưng điều đó sẽ hiệu quả. toArray
đảm bảo bất kỳ thứ tự được bảo tồn
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ố trong cùng một trật tự .
Something như
Set<MyType> mySet = new LinkedHashSet();
...
MyType[] asArray = mySet.toArray();
for (int i = asArray.length - 1; i>=0; i--){
..
}
Tác phẩm này hoạt động nhưng không hiệu quả vì nó sao chép tập hợp ... – fig
Từ javadoc: "danh sách liên kết này định nghĩa thứ tự lặp, đó là thứ tự mà các yếu tố được đưa vào các thiết lập (chèn theo đơn đặt hàng)."
Vì vậy, bạn có thể chỉ đơn giản là:
LinkedHashSet<Integer> numbers = new LinkedHashSet<Integer>();
numbers.add(1);
numbers.add(2);
numbers.add(33);
numbers.add(44);
numbers.add(108);
for (Integer i : numbers) {
System.out.println(i);
}
"từ ảnh cuối cùng đến cái đầu tiên". – hvgotcodes
Đây là một cách khác:
LinkedHashSet<T> set = ...
List<T> list = new ArrayList<>(set);
Collections.reverse(list);
for(T item : list){
...
}
Nếu bạn thực sự có nghĩa là LinkedHashSet, bạn có thể đặt các yếu tố vào một ArrayList và sau đó sử dụng ListIterator của ArrayList.
ListIterator<T> l = new ArrayList<T>(yourLinkedHashList).listIterator();
// ListIterator can iterate in reverse
while(l.hasPrevious()) {
T obj = l.previous();
}
- 1. Chuyển tiếp cổng âm đạo ngược?
- 2. LinkedHashSet để thực hiện LRU
- 3. Tương đương với LinkedHashSet (Java) trong C# là gì?
- 4. Sắp xếp một LinkedHashSet
- 5. LinkedHashSet or ArrayList
- 6. Thay thế ngược chéo với chuyển tiếp chéo hoặc dấu gạch chéo ngược đôi trong C++
- 7. Tham chiếu Chuyển tiếp Pháp lý Java
- 8. Cổng Apache chuyển tiếp
- 9. Redirect hoặc chuyển tiếp
- 10. jquery di chuyển trượt chuyển tiếp ngược lại cho thấy trang trống ở giữa quá trình chuyển đổi
- 11. Tại sao lặp qua một mảng ngược nhanh hơn sau đó chuyển tiếp
- 12. Django-South DataMigration - Ứng dụng có sẵn trong chuyển tiếp() nhưng không ngược()?
- 13. Chuyển tiếp cổng
- 14. Giao tiếp nối tiếp Java trên Windows
- 15. So sánh trực tiếp trong Java ra khỏi hộp
- 16. java 7 ngôn ngữ tương thích ngược
- 17. paramiko chuyển tiếp
- 18. getComputedStyle và chuyển tiếp
- 19. Xóa chuyển tiếp CSS
- 20. Chuyển tiếp D3.js
- 21. Loại chuyển tiếp
- 22. Chuyển tiếp mảng 2D
- 23. Chuyển tiếp URL Jersey
- 24. Chuyển đổi giá trị Boolean/đảo ngược
- 25. rowSet không hỗ trợ di chuyển ngược
- 26. Chuyển đổi mảng byte thành số nguyên trong Java và ngược lại
- 27. Chuyển đổi chuỗi thành khóa mã hóa và ngược lại java
- 28. Thư viện để chuyển đổi native2ascii và ngược lại
- 29. REST - chuyển tiếp trạng thái mô hình
- 30. Phương pháp nối tiếp Java
Tại sao trong khung thu thập Java, nó không được bao gồm. LinkedHashSet duy trì thứ tự FIFO để một tiện ích chuyển đổi thứ tự thành LIFO nên ở đó có vẻ khác nhau khi yêu cầu là duy trì thứ tự chèn cùng một lúc chúng ta có thể cần lặp lại theo thứ tự ngược lại. Trong dự án của tôi đã có vài lần tôi cần điều này rồi. Thật không may, tôi phải sử dụng Danh sách làm trung gian để tận dụng tiện ích Collections.reverse(). Đây là bẩn không phải là nó! – Bhavesh