是否可以在不排序的情況下檢索 LinkedList 的物件?
class MyClass<T> implements Iterable<T> {
private LinkedList<T> myList = new LinkedList<>();
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
@Override
public boolean hasNext() {
return false;
}
@Override
public T next() {
// SHOULD RETURN THE ELEMENTS OF MYLIST IN A SORTED WAY
return null;
}
};
}
}
在這種情況下,我們可以假設型別 T 的物件有一個用于排序的 Integer 欄位
uj5u.com熱心網友回復:
這是不可能的,除非您創建額外的方法來“即時”排序或將預先排序的串列存盤在另一個物件中(我假設您不想更改原始串列順序)。
這兩種方法都有成本:
- 您可以保留“當前”索引的索引,并在整個串列中查找下一個索引,但這會消耗 CPU
- 您可以創建串列的私有副本并對其進行排序,然后回傳這個新串列,但它會消耗更多記憶體,并且您必須保持新串列更新,以防原始串列的值發生更改。
uj5u.com熱心網友回復:
簡短的回答:沒有。
排序有點像找到一個運行的最小值/最大值,如果不遍歷串列中的每個元素,你就無法找到它,因此你需要以某種方式對它進行排序,這樣做的方法是通過 aHeap這意味著額外的記憶體,如果您不希望對串列本身進行排序。
@Override
public Iterator<T> iterator() {
PriorityQueue<T> heap = new PriorityQueue<>(list);
return new Iterator<T>() {
@Override
public boolean hasNext() {
return !heap.isEmpty();
}
@Override
public T next() {
return heap.poll();
}
};
}
uj5u.com熱心網友回復:
如果型別T實作Comparable<T>,你可以這樣做。
static class MyClass<T extends Comparable<T>> implements Iterable<T> {
private LinkedList<T> myList = new LinkedList<>();
@Override
public Iterator<T> iterator() {
return myList.stream().sorted().iterator();
}
}
public static void main(String[] args) {
MyClass<Integer> obj = new MyClass<>();
obj.myList.add(2);
obj.myList.add(0);
obj.myList.add(1);
for (int i : obj)
System.out.println(i);
System.out.println(obj.myList);
}
輸出:
0
1
2
[2, 0, 1]
或者,您可以通過建構式傳遞比較器。
static class MyClass<T> implements Iterable<T> {
private LinkedList<T> myList = new LinkedList<>();
private final Comparator<T> comparator;
public MyClass(Comparator<T> comparator) {
this.comparator = comparator;
}
@Override
public Iterator<T> iterator() {
return myList.stream().sorted(comparator).iterator();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/333890.html
上一篇:檢查總訂單是否細化了部分訂單
