Java 8 合并两个文本输入文件,每行文件一个接一个。参见示例
我试图用Java8解决一个问题,我已经用一个简单的for循环解决了这个问题。但是我不知道怎么做。 问题是: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,
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)));
}