给定 a LinkedList
,我想通过Spliterator
. 我不能使用方法size()
。我必须实现trySplit()
具有以下条件的方法:如果Spliterator
至少有 5 个元素,则返回new Spliterator
,它将通过前 4 个元素;否则return null
。我不知道如何在以下条件下拆分它。现在我只能得到一批元素。我怎样才能得到所有批次?我在这个任务上苦苦挣扎了 5 个多小时,没有运气。先感谢您!
https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.htmlSpliterator
在size()
已知/允许的情况下提供如何使用的信息。
界面:
import java.util.Spliterator;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
public interface Li<A> {
Spliterator<A> getSpliterator();
default Stream<A> stream() {
return StreamSupport.stream(getSpliterator(), false);
}
default Stream<A> parallelStream() {
return StreamSupport.stream(getSpliterator(), true);
}
}
班级:
import java.util.Spliterator;
import java.util.function.Consumer;
public class LL<A> implements Li<A>{
private A hd;
private LL<A> tl;
public boolean isEmpty(){
return hd == null && tl == null;
}
public void add(A a){
if (isEmpty()){
tl = new LL<>();
hd = a;
}else{
tl.add(a);
}
}
public LL(A hd, LL<A> tl){
this.hd = hd;
this.tl = tl;
}
public LL() {
this(null, null);
}
public A get(int i) {
return i==0 ? hd : tl.get(i-1);
}
@Override
public Spliterator<A> getSpliterator(){
return new MySplitter(0, Integer.MAX_VALUE,this);
}
private class MySplitter implements Spliterator<A>{
private LL<A> ll;
int start;
int end;
MySplitter(int start, int end, LL<A> ll){
this.ll = ll;
this.start = start;
this.end = end;
}
public A get(int i){
return i==0 ? hd : tl.get(i-1);
}
@Override
public boolean tryAdvance(Consumer<? super A> action){
if (this.get(start) != null && start < end) {
action.accept(ll.get(start++));
return true;
}else {
return false;
}
}
@Override
public Spliterator<A> trySplit(){
try {
ll.get(start + 5);
end = start + 5;
}catch (Exception e){
return null;
}
start = end;
end += 5;
return new MySplitter(start, start + 4, ll).trySplit();
}
@Override
public long estimateSize(){
return Long.MAX_VALUE;
}
@Override
public int characteristics(){
return ORDERED | SUBSIZED;
}
}
}
主要方法:
public static void main (String[] args){
LL<String> l = new LL();
l.add("1");
l.add("2");
l.add("3");
l.add("4");
l.add("5");
l.add("6");
l.add("7");
l.add("8");
l.add("9");
l.add("10");
l.add("11");
l.add("12");
l.add("13");
l.stream().forEach(System.out::println);
System.out.println();
System.out.println("now parallel");
System.out.println();
l.parallelStream().forEach(System.out::println);
}
预期输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
now parallel
5
6
7
8
1
2
3
4
13
9
10
11
12
实际输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
now parallel
6
7
8
9
10