java – 将多个Iterables包装到一个Interable中
发布时间:2020-12-15 08:39:10 所属栏目:Java 来源:网络整理
导读:说我有两个收藏: Collection Integer foo = new ArrayList Integer ();Collection Integer bar = new ArrayList Integer (); 并说有时我想单独迭代它们,但有时一起.有没有办法在foo和bar周围创建一个包装器,这样我就可以迭代组合对,但每当foo和bar改变时它
说我有两个收藏:
Collection< Integer > foo = new ArrayList< Integer >(); Collection< Integer > bar = new ArrayList< Integer >(); 并说有时我想单独迭代它们,但有时一起.有没有办法在foo和bar周围创建一个包装器,这样我就可以迭代组合对,但每当foo和bar改变时它也会更新? (即Collection.addAll()不适合). 例如: Collection< Integer > wrapper = ... // holds references to both bar and foo foo.add( 1 ); bar.add( 99 ); for( Integer fooInt : foo ) { System.out.println( fooInt ); } // output: 1 for( Integer barInt : bar ) { System.out.println( barInt ); } // output: 99 for( Integer wrapInt : wrapper ) { System.out.println( wrapInt ); } // output: 1,99 foo.add( 543 ); for( Integer wrapInt : wrapper ) { System.out.println( wrapInt ); } // output: 1,99,543 谢谢! 解决方法
我写了两个函数:
/** * Create an Iterator from multiple Iterators. The returned Iterator * traverses all elements from all sources,in the order,as if they belong * to the same source. * * @param <T> type of elements * @param sources sources of the elements,in order of traversal * @return an iterator over multiple iterators in sequence */ public static <T> Iterator<T> concatenate(final Iterator<T> ... sources) { if (sources.length == 0) { return new Iterator<T>() { @Override public boolean hasNext() { return false; } @Override public T next() { throw new NoSuchElementException("end of iteration"); } @Override public void remove() { throw new IllegalStateException("no previous element"); } }; } return new Iterator<T>() { Iterator<Iterator<T>> sourcesIterator = Arrays.asList(sources).iterator(); Iterator<T> currentIterator = sourcesIterator.next(); @Override public boolean hasNext() { if (currentIterator.hasNext()) { return true; } else { if (sourcesIterator.hasNext()) { currentIterator = sourcesIterator.next(); return hasNext(); } else { return false; } } } @Override public T next() { if (hasNext()) { return currentIterator.next(); } else { throw new NoSuchElementException("end of iteration"); } } @Override public void remove() { currentIterator.remove(); } }; } /** * Create an Iterable from multiple Iterables. The returned Iterable * traverses all elements from all sources,in order of traversal * @return an iterable over multiple iterators in sequence */ @SuppressWarnings("unchecked") // impossible to create a generic array public static <T> Iterable<T> concatenate(final Iterable<T> ... sources) { return new Iterable<T>() { @Override public Iterator<T> iterator() { final Iterator[] iteratorsArrays = new Iterator[sources.length]; for (int i = 0; i < sources.length; i++) { iteratorsArrays[i] = sources[i].iterator(); } return concatenate(iteratorsArrays); } }; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |