[英]Java: how to iterate on a LinkedList in a sorted way?
是否可以在不排序的情况下检索 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 字段
这是不可能的,除非您创建额外的方法来“即时”排序或将预先排序的列表存储在另一个对象中(我假设您不想更改原始列表顺序)。
这两种方法都有成本:
简短的回答:没有。
排序有点像找到一个运行的最小值/最大值,如果不遍历列表中的每个元素,你就无法找到它,因此你需要以某种方式对它进行排序,一种方法是通过Heap
,这意味着额外的内存如果您不想对列表本身进行排序。
@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();
}
};
}
如果类型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);
}
输出:
0
1
2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.