2012-05-24 29 views
17

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

+0

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

Trả lời

19

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.

+0

'New LinkedList <> (set)' sẽ sao chép tất cả các mục, phải không? – Sasha

+0

@Sasha Có, nó sẽ. – Jeffrey

7

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--){ 
.. 
} 
+0

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

-7

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); 
} 
+1

"từ ảnh cuối cùng đến cái đầu tiên". – hvgotcodes

5

Đây là một cách khác:

LinkedHashSet<T> set = ... 

List<T> list = new ArrayList<>(set); 
Collections.reverse(list); 

for(T item : list){ 
    ... 
} 
2

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(); 
} 
Các vấn đề liên quan