猿问

将多个集合合并为一个逻辑集合?

假设我有恒定数量的集合(例如3个ArrayList)作为类的成员。现在,我想将所有元素公开给其他类,以便它们可以简单地遍历所有元素(理想情况下为只读)。我正在使用番石榴集合,不知道如何使用番石榴可迭代器/迭代器在内部集合上生成逻辑视图而无需制作临时副本。



大话西游666
浏览 681回答 3
3回答

幕布斯6054654

使用Guava,您可以使用Iterables.concat(Iterable<T> ...),它创建所有可迭代对象的实时视图,并串联在一起(如果更改可迭代对象,则串联版本也会更改)。然后将串联的可迭代对象包装为Iterables.unmodifiableIterable(Iterable<T>)(我之前没有看到只读要求)。从Iterables.concat( .. )JavaDocs:将多个可迭代项合并为一个可迭代项。返回的Iterable具有迭代器,该迭代器遍历输入中每个Iterable的元素。直到必要时才轮询输入迭代器。remove() 当相应的输入迭代器支持它时,返回的iterable的迭代器也将支持它。虽然这并未明确表示这是实时视图,但最后一句话暗示它是(Iterator.remove()仅在支持后备迭代器支持的情况下才支持该方法,除非使用实时视图)样例代码:final List<Integer> first&nbsp; = Lists.newArrayList(1, 2, 3);final List<Integer> second = Lists.newArrayList(4, 5, 6);final List<Integer> third&nbsp; = Lists.newArrayList(7, 8, 9);final Iterable<Integer> all =&nbsp; &nbsp; Iterables.unmodifiableIterable(&nbsp; &nbsp; &nbsp; &nbsp; Iterables.concat(first, second, third));System.out.println(all);third.add(9999999);System.out.println(all);输出:[1、2、3、4、5、6、7、8、9][1、2、3、4、5、6、7、8、9、9999999]编辑:根据Damian的要求,这是一种类似的方法,可返回实时的“收藏夹视图”public final class CollectionsX {&nbsp; &nbsp; static class JoinedCollectionView<E> implements Collection<E> {&nbsp; &nbsp; &nbsp; &nbsp; private final Collection<? extends E>[] items;&nbsp; &nbsp; &nbsp; &nbsp; public JoinedCollectionView(final Collection<? extends E>[] items) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.items = items;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public boolean addAll(final Collection<? extends E> c) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new UnsupportedOperationException();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void clear() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (final Collection<? extends E> coll : items) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; coll.clear();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public boolean contains(final Object o) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new UnsupportedOperationException();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public boolean containsAll(final Collection<?> c) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new UnsupportedOperationException();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public boolean isEmpty() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return !iterator().hasNext();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public Iterator<E> iterator() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Iterables.concat(items).iterator();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public boolean remove(final Object o) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new UnsupportedOperationException();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public boolean removeAll(final Collection<?> c) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new UnsupportedOperationException();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public boolean retainAll(final Collection<?> c) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new UnsupportedOperationException();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public int size() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int ct = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (final Collection<? extends E> coll : items) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ct += coll.size();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return ct;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public Object[] toArray() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new UnsupportedOperationException();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public <T> T[] toArray(T[] a) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new UnsupportedOperationException();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public boolean add(E e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new UnsupportedOperationException();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; /**&nbsp; &nbsp; &nbsp;* Returns a live aggregated collection view of the collections passed in.&nbsp; &nbsp; &nbsp;* <p>&nbsp; &nbsp; &nbsp;* All methods except {@link Collection#size()}, {@link Collection#clear()},&nbsp; &nbsp; &nbsp;* {@link Collection#isEmpty()} and {@link Iterable#iterator()}&nbsp; &nbsp; &nbsp;*&nbsp; throw {@link UnsupportedOperationException} in the returned Collection.&nbsp; &nbsp; &nbsp;* <p>&nbsp; &nbsp; &nbsp;* None of the above methods is thread safe (nor would there be an easy way&nbsp; &nbsp; &nbsp;* of making them).&nbsp; &nbsp; &nbsp;*/&nbsp; &nbsp; public static <T> Collection<T> combine(&nbsp; &nbsp; &nbsp; &nbsp; final Collection<? extends T>... items) {&nbsp; &nbsp; &nbsp; &nbsp; return new JoinedCollectionView<T>(items);&nbsp; &nbsp; }&nbsp; &nbsp; private CollectionsX() {&nbsp; &nbsp; }}

慕工程0101907

使用Java的纯Java 8解决方案Stream。常数假设private Collection<T> c, c2, c3。一种解决方案:public Stream<T> stream() {&nbsp; &nbsp; return Stream.concat(Stream.concat(c.stream(), c2.stream()), c3.stream());}另一个解决方案:public Stream<T> stream() {&nbsp; &nbsp; return Stream.of(c, c2, c3).flatMap(Collection::stream);}可变数假设private Collection<Collection<T>> cs:public Stream<T> stream() {&nbsp; &nbsp; return cs.stream().flatMap(Collection::stream);}

catspeake

如果您至少使用Java 8,请参阅我的其他答案。如果您已经在使用Google Guava,请参见Sean Patrick Floyd的答案。如果您坚持使用Java 7,并且不想包含Google Guava,则可以Iterables.concat()使用Iterable和最多编写自己的(只读)代码Iterator:常数public static <E> Iterable<E> concat(final Iterable<? extends E> iterable1,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;final Iterable<? extends E> iterable2) {&nbsp; &nbsp; return new Iterable<E>() {&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public Iterator<E> iterator() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return new Iterator<E>() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final Iterator<? extends E> iterator1 = iterable1.iterator();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final Iterator<? extends E> iterator2 = iterable2.iterator();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public boolean hasNext() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return iterator1.hasNext() || iterator2.hasNext();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public E next() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return iterator1.hasNext() ? iterator1.next() : iterator2.next();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; };&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; };}可变数@SafeVarargspublic static <E> Iterable<E> concat(final Iterable<? extends E>... iterables) {&nbsp; &nbsp; return concat(Arrays.asList(iterables));}public static <E> Iterable<E> concat(final Iterable<Iterable<? extends E>> iterables) {&nbsp; &nbsp; return new Iterable<E>() {&nbsp; &nbsp; &nbsp; &nbsp; final Iterator<Iterable<? extends E>> iterablesIterator = iterables.iterator();&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public Iterator<E> iterator() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return !iterablesIterator.hasNext() ? Collections.emptyIterator()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : new Iterator<E>() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Iterator<? extends E> iterableIterator = nextIterator();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public boolean hasNext() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return iterableIterator.hasNext();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public E next() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final E next = iterableIterator.next();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; findNext();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return next;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Iterator<? extends E> nextIterator() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return iterablesIterator.next().iterator();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Iterator<E> findNext() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (!iterableIterator.hasNext()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!iterablesIterator.hasNext()) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iterableIterator = nextIterator();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return this;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }.findNext();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; };}
随时随地看视频慕课网APP

相关分类

Java
我要回答