繁体   English   中英

Java:如何以排序方式迭代 LinkedList?

[英]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 字段

这是不可能的,除非您创建额外的方法来“即时”排序或将预先排序的列表存储在另一个对象中(我假设您不想更改原始列表顺序)。

这两种方法都有成本:

  • 您可以保留“当前”索引的索引,并在整个列表中查找下一个索引,但这会消耗 CPU
  • 您可以创建列表的私有副本并对其进行排序,然后返回这个新列表,但它会消耗更多内存,并且您必须保持新列表更新,以防原始列表的值发生更改。

简短的回答:没有。

排序有点像找到一个运行的最小值/最大值,如果不遍历列表中的每个元素,你就无法找到它,因此你需要以某种方式对它进行排序,一种方法是通过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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM