0

When attempting to create an iterator from a Stream that was concatenated from two previous streams, I get a NoSuchElementException, as the iterator doesn't recognise that the Stream has elements due to some problems with the Spliterator. The concatenated Stream seems to have two spliterators, despite the previous streams being of the same type. I also get this error when I tried to convert the concatenated stream into an array to try get round the problem.

Stream<Node> nodeStream = Stream.of(firstNode);
while (!goal) {
    Iterator<Node> iterator = nodeStream.iterator();
    Node head = iterator.next();
    Stream<Node> tail = Stream.generate(iterator::next).filter(n -> n != head);
    Node[] newNodes = head.expand(end);
    if (newNodes.length == 1) {
        goal = true;
        endNode = newNodes[0];
    }
    nodeStream = Stream.concat(Arrays.stream(newNodes), tail);
    nodeStream = nodeStream.sorted(Comparator.comparing(n -> n.routeCost(end)));
}

The error is as follows:

Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.Spliterators$1Adapter.next(Spliterators.java:688)
    at java.base/java.util.stream.StreamSpliterators$InfiniteSupplyingSpliterator$OfRef.tryAdvance(StreamSpliterators.java:1358)
    at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.lambda$initPartialTraversalState$0(StreamSpliterators.java:292)
    at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.fillBuffer(StreamSpliterators.java:206)
    at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.doAdvance(StreamSpliterators.java:161)
    at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.tryAdvance(StreamSpliterators.java:298)
    at java.base/java.util.stream.Streams$ConcatSpliterator.tryAdvance(Streams.java:723)
    at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.lambda$initPartialTraversalState$0(StreamSpliterators.java:292)
    at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.fillBuffer(StreamSpliterators.java:206)
    at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.doAdvance(StreamSpliterators.java:161)
    at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.tryAdvance(StreamSpliterators.java:298)
    at java.base/java.util.Spliterators$1Adapter.hasNext(Spliterators.java:681)
    at java.base/java.util.Spliterators$1Adapter.next(Spliterators.java:687)
    at inf.ed.ac.uk.Route.generateRoute(Route.java:35)

I am trying to expand the first node (returns 16 new nodes) add them to the stream, sort it, and repeat, this is part of an implementation of the A* algorithm on gps coordinates

Code for Node is

public class Node {
    boolean goal = false;
    Node parent;
    final LngLat coords;
    LngLat.Compass direction;
    double cost;
    private Route route;

    public Node[] expand(LngLat end) {
        ArrayList<Node> nodes = new ArrayList<>();
        for (LngLat.Compass direction: LngLat.Compass.values()) {
            Node node = new Node(coords.nextPosition(direction), this, direction);

            if (noFlyClear(node)) {
                if (!route.contains(node)) {
                    if (node.coords.closeTo(end)) {
                        node.goal = true;
                        return new Node[]{node};
                    }
                    nodes.add(node);
                    route.visited.add(node);
                }
            }

        }
        return nodes.toArray(Node[]::new);
    } 

But that's since I changed to ArrayLists I'm still unsure what the issue was originally

Nurio Fernández
  • 518
  • 5
  • 22

0 Answers0