首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组数组

数组数组
EN

Stack Overflow用户
提问于 2017-04-25 10:34:10
回答 6查看 300关注 0票数 2

我有两张排列表

代码语言:javascript
复制
    ArrayList<File> filesImage= new ArrayList<File>();
    ArrayList<File> filesBox= new ArrayList<File>();

我想像这样合并成第三列

代码语言:javascript
复制
    ArrayList<File[]> combinedFiles=new ArrayList<File[]>();

我该怎么做?产出应如下:

代码语言:javascript
复制
   [[ first object of filesImage, first object of filesBox],[second Object],[]]
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-04-25 10:44:20

考虑到这两个数组的长度是相等的,您希望将它们组合起来,我会亲自这样做。

代码语言:javascript
复制
List<File[]> combinedFiles= new ArrayList<File[]>();

for(int i = 0; i < filesBox.size(); i++){
    combinedFiles.add(new File[] {filesImage.get(i), filesBox.get(i)});
}

抱歉,如果我的方法不正确,我已经有一段时间没有用java编程了。

票数 5
EN

Stack Overflow用户

发布于 2017-04-25 10:46:04

首先,我创建一个类来保存文件引用,例如:

代码语言:javascript
复制
class FileElement {
  File image;
  File box;
}

然后,我会创建一个列表,而不是数组:

代码语言:javascript
复制
List<FileElement> combinedFiles = ...;

然后,我会同时遍历这两个列表:

代码语言:javascript
复制
Iterator<File> imgItr = filesImages.iterator();
Iterator<File> boxItr = filesBox.iterator();

//This assumes it's ok if both lists have different sizes. 
//If it isn't you could try && instead, i.e. stop once you'd miss an image or a box
while( imgItr.hasNext() || boxItr.hasNext() ) {
   FileElement e = ...;

   if( imgItr.hasNext() ) { 
     e.image = imgItr.next();
   }

   if( boxItr.hasNext() ) { 
     e.box= boxItr.next();
   }

   combinedFiles.add( e );
}
票数 5
EN

Stack Overflow用户

发布于 2017-04-25 10:46:31

假设这两个列表长度相等,下面是使用Java8 streams和zip()的解决方案。

代码语言:javascript
复制
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;


public class Demo {

    public static void main( String[] args ) {
        List<String> filesImage = Arrays.asList("a","b","c");
        List<String> filesBox   = Arrays.asList("1","2", "3");

        List<String[]> result = zip(filesImage.stream(), filesBox.stream(), (a,b) -> new String[] {a,b}).collect( Collectors.toList() );

        for ( String[] e : result ) {
            System.out.println( Arrays.asList(e) );
        }
    }

    public static <A, B, C> Stream<C> zip(Stream<A> streamA, Stream<B> streamB, BiFunction<A, B, C> zipper) {
        final Iterator<A> iteratorA = streamA.iterator();
        final Iterator<B> iteratorB = streamB.iterator();
        final Iterator<C> iteratorC = new Iterator<C>() {
            @Override
            public boolean hasNext() {
                return iteratorA.hasNext() && iteratorB.hasNext();
            }

            @Override
            public C next() {
                return zipper.apply(iteratorA.next(), iteratorB.next());
            }
        };
        final boolean parallel = streamA.isParallel() || streamB.isParallel();
        return iteratorToFiniteStream(iteratorC, parallel);
    }

    public static <T> Stream<T> iteratorToFiniteStream( Iterator<T> iterator, boolean parallel) {
        final Iterable<T> iterable = () -> iterator;
        return StreamSupport.stream(iterable.spliterator(), parallel);
    }
}

我从Karol here那里借用了zip的实现。Zip是函数世界中以这种方式组合两个列表的模式的名称。还请注意,尽管Demo使用String而不是File,但概念仍然完全相同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43608286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档