Java 8 合并两个文本输入文件,每行文件一个接一个。参见示例

Java 8 合并两个文本输入文件,每行文件一个接一个。参见示例,java-8,stream,java-stream,Java 8,Stream,Java Stream,我试图用Java8解决一个问题,我已经用一个简单的for循环解决了这个问题。但是我不知道怎么做。 问题是: File1 : 1,sdfasfsf 2,sdfhfghrt 3,hdfxcgyjs File2 : 10,xhgdfgxgf 11,hcvcnhfjh 12,sdfgasasdfa 13,ghdhtfhdsdf 输出应该是 1,sdfasfsf 10,xhgdfgxgf 2,sdfhfghrt 11,hcvcnhfjh 3,hdfxcgyjs 12,sdfgasasdfa 13,

我试图用Java8解决一个问题,我已经用一个简单的for循环解决了这个问题。但是我不知道怎么做。 问题是:

File1 : 
1,sdfasfsf
2,sdfhfghrt
3,hdfxcgyjs

File2 : 
10,xhgdfgxgf
11,hcvcnhfjh
12,sdfgasasdfa
13,ghdhtfhdsdf
输出应该是

1,sdfasfsf
10,xhgdfgxgf
2,sdfhfghrt
11,hcvcnhfjh
3,hdfxcgyjs
12,sdfgasasdfa
13,ghdhtfhdsdf
我已经让它基本上起作用了

核心逻辑是:

List<String> left  = readFile(lhs);
List<String> right = readFile(rhs);
int leftSize = left.size();
int rightSize = right.size();
int size =  leftSize > rightSize? leftSize : right.size();
for (int i = 0; i < size; i++) {
    if(i < leftSize) {
        merged.add(left.get(i));
    }
    if(i < rightSize) {
        merged.add(right.get(i));
    }
}
List left=readFile(lhs);
列表右侧=读取文件(rhs);
int leftSize=left.size();
int rightSize=right.size();
int size=leftSize>rightSize?leftSize:right.size();
对于(int i=0;i
  • 输入文件位于同一repo的src/test/resources/com/linux/test/merge/list中(只允许发布两个链接)
然而,我吹嘘我可以很容易地使用流来实现这一点,现在我甚至不确定这是否可以实现


非常感谢您的帮助。

代码逻辑如下:

int leftSize = left.size();
int rightSize = right.size();
int minSize = Math.min(leftSize,rightSize);

for (int i = 0; i < minSize; i++) {
    merged.add(left.get(i));
    merged.add(right.get(i));
}

// adding remaining elements
merged.addAll(
        minSize < leftSize ? left.subList(minSize, leftSize)
                           : right.subList(minSize, rightSize)
);
切换方法如下所示:

<T> Iterator<? extends T> toggle(List<T> left, List<T> right) {
    return new Iterator<T>() {
        private final int RIGHT = 1;
        private final int LEFT = 0;
        int cursor = -1;
        Iterator<T>[] pair = arrayOf(left.iterator(), right.iterator());

        @SafeVarargs
        private final Iterator<T>[] arrayOf(Iterator<T>... iterators) {
            return iterators;
        }

        @Override
        public boolean hasNext() {
            for (Iterator<T> each : pair) {
                if (each.hasNext()) {
                    return true;
                }
            }
            return false;
        }

        @Override
        public T next() {
            return pair[cursor = next(cursor)].next();
        }

        private int next(int cursor) {
            cursor=pair[LEFT].hasNext()?pair[RIGHT].hasNext()?cursor: RIGHT:LEFT;
            return (cursor + 1) % pair.length;
        }
    };
}

Iterator您可以简化操作,以减少每个元素的条件:

int leftSize = left.size(), rightSize = right.size(), min = Math.min(leftSize, rightSize);
List<String> merged = new ArrayList<>(leftSize+rightSize);
for(int i = 0; i < min; i++) {
    merged.add(left.get(i));
    merged.add(right.get(i));
}
if(leftSize!=rightSize) {
    merged.addAll(
        (leftSize<rightSize? right: left).subList(min, Math.max(leftSize, rightSize)));
}
int-leftSize=left.size(),rightSize=right.size(),min=Math.min(leftSize,rightSize);
列表合并=新的ArrayList(leftSize+rightSize);
对于(int i=0;i(leftSizeThanks,听起来不错。我将研究函数.identity()和flatmap more:)感谢帮助不要发布为答案,因为它不使用流,但使用apache commons迭代器实用程序这很简单,也不容易出错:
List merged=IteratorUtils.toList(IteratorUtils.zippingIterator(left.iterator(),right.iterator());
int leftSize = left.size(), rightSize = right.size(), min = Math.min(leftSize, rightSize);
List<String> merged = new ArrayList<>(leftSize+rightSize);
for(int i = 0; i < min; i++) {
    merged.add(left.get(i));
    merged.add(right.get(i));
}
if(leftSize!=rightSize) {
    merged.addAll(
        (leftSize<rightSize? right: left).subList(min, Math.max(leftSize, rightSize)));
}
int leftSize = left.size(), rightSize = right.size(), min = Math.min(leftSize, rightSize);

List<String> merged=IntStream.range(0, min)
        .mapToObj(i -> Stream.of(left.get(i), right.get(i)))
        .flatMap(Function.identity())
        .collect(Collectors.toCollection(ArrayList::new));
if(leftSize!=rightSize) {
    merged.addAll(
        (leftSize<rightSize? right: left).subList(min, Math.max(leftSize, rightSize)));
}