我可以包装多个Java排序集,使它们看起来像一个吗?

时间:2017-05-24 10:15:43

标签: java collections

我有几个数据列表,我偶尔会将其视为一个列表。

我当前创建了一个新列表(type Result struct { ID bson.ObjectId `json:"id" bson:"_id"` Username string `json:"username" bson:"username"` Distance int64 `json:"distance" bson:"distance"` NewsCount int64 `json:"news_count" bson:"news_count"` } ),然后遍历现有列表,并执行newList

当我希望能够循环遍历所有子项目时,这非常耗时,并且包含大量分配。

相反,有没有办法在父迭代器中美化包装这个列表,然后遍历这个?

3 个答案:

答案 0 :(得分:1)

我会创建一个表示列表列表的类,并存储对其中列表的引用。该列表将实现Iterator,以便您可以像其他任何Collection一样迭代它:

public class ListOfLists<U> implements Iterator<U> {

    List<List<U>> lists = new ArrayList<>();

    private int currentList = 0;
    private Iterator<U> currentIter;

    public ListOfLists(List<U>... lists) {
        this.lists.addAll(Arrays.asList(lists));

        currentIter = this.lists.get(0).iterator();
    }

    void add(List<U> list) {
        lists.add(list);
    }

    @Override
    public boolean hasNext() {
        while (currentList < lists.size() - 1 && !currentIter.hasNext()) {
            currentList++;
            currentIter = lists.get(currentList).iterator();
        }

        return currentIter.hasNext();
    }

    @Override
    public U next() {
        while (currentList < lists.size() - 1 && !currentIter.hasNext()) {
            currentList++;
            currentIter = lists.get(currentList).iterator();
        }

        return currentIter.next();
    }

    public static void main(String... args) {
        List<Integer> l1 = Arrays.asList(1, 2, 3, 4);
        List<Integer> l2 = Arrays.asList(5, 7, 9);
        List<Integer> l3 = Arrays.asList(42, 43, 44);

        ListOfLists<Integer> ii = new ListOfLists<>(l1, l2, l3);

        while (ii.hasNext())
            System.out.println(ii.next());
    }
}

答案 1 :(得分:0)

在jdk-8中,您可以使用Stream#flatMap&amp;更简单地合并多个迭代器。 Stream#iterator,例如:

Iterator<T> all = Stream.of(list1,list2,...,listN).stream()
                                                  .flatMap(List::stream)
                                                  .iterator();

注意flatMap只迭代想要合并的所有List,而不是List中的所有元素。

答案 2 :(得分:0)

感谢rolf-schäuble的链接,这个答案提供了一个很好的解决方案: https://stackoverflow.com/a/41488126/92441