Java如何不排序原LinkedList即可按排序顺序遍历其元素
问题结论
可以实现,不需要对原LinkedList做任何排序修改,就能按排序顺序返回元素。
实现逻辑
我们只需要在迭代器初始化的时候,先把原LinkedList的元素拷贝到一个新的临时列表中,对临时列表做排序,之后迭代器直接遍历这个排序后的临时列表即可,全程不会改动原LinkedList的元素顺序。
完整代码实现
import java.util.*; class MyClass<T> implements Iterable<T> { private LinkedList<T> myList = new LinkedList<>(); @Override public Iterator<T> iterator() { // 1. 拷贝原列表所有元素到临时列表,不会修改原列表 List<T> sortedCopy = new ArrayList<>(myList); // 2. 对临时列表按排序字段升序排序,需要降序的话追加.reversed()即可 // 请将下方T::getSortKey替换为你实际的排序字段取值逻辑,比如item -> item.sortField sortedCopy.sort(Comparator.comparingInt(T::getSortKey)); // 3. 直接返回排序后副本的迭代器,代理所有迭代逻辑 return sortedCopy.iterator(); } }
注意事项
- 每次调用
iterator()生成迭代器时,都会基于当前myList的最新元素生成排序副本,原列表的增删改操作不会影响原有存储顺序,且修改结果会在下次生成迭代器时生效 - 如果你的排序字段是公开属性,只需要把
Comparator.comparingInt里的取值逻辑替换为item -> item.你的排序字段名即可 - 如果数据量较大且迭代调用非常频繁,可以额外加一层排序缓存,在
myList被修改时才清空缓存重新排序,减少重复排序的性能开销
内容的提问来源于stack exchange,提问作者user13121591
相关产品推荐
相关产品推荐

