मैं जावा 8 Spliterator के साथ खेल रहा हूं और एक दिए गए एन तक Fibonacci संख्याओं को स्ट्रीम करने के लिए एक बनाया है। तो फिबोनैकी श्रृंखला 0, 1, 1, 2, 3, 5, 8, ...
फिबोनाची संख्याओं को स्ट्रीम करने के लिए स्प्लिटरेटर को कैसे कार्यान्वित करें?
n fib(n)
-----------
-1 0
1 0
2 1
3 1
4 2
के बाद के लिए मेरे कार्यान्वयन जो ढेर स्मृति से बाहर चलाने से पहले 1 के एक झुंड प्रिंट है। क्या आप मुझे बग खोजने में मदद कर सकते हैं? (मुझे लगता है कि यह currentIndex
को आगे नहीं बढ़ा रहा है, लेकिन मुझे यकीन नहीं है कि इसे किस मूल्य पर सेट करना है)।
संपादित करें 1: यदि आप उत्तर देने का निर्णय लेते हैं, तो कृपया इसे प्रश्न के लिए प्रासंगिक रखें। यह सवाल कुशल फाइबोनैकी नंबर पीढ़ी के बारे में नहीं है; यह स्प्लिटरेटर सीखने के बारे में है।
FibonacciSpliterator:
@RequiredArgsConstructor
public class FibonacciSpliterator implements Spliterator<FibonacciPair> {
private int currentIndex = 3;
private FibonacciPair pair = new FibonacciPair(0, 1);
private final int n;
@Override
public boolean tryAdvance(Consumer<? super FibonacciPair> action) {
// System.out.println("tryAdvance called.");
// System.out.printf("tryAdvance: currentIndex = %d, n = %d, pair = %s.\n", currentIndex, n, pair);
action.accept(pair);
return n - currentIndex >= 2;
}
@Override
public Spliterator<FibonacciPair> trySplit() {
// System.out.println("trySplit called.");
FibonacciSpliterator fibonacciSpliterator = null;
if (n - currentIndex >= 2) {
// System.out.printf("trySplit Begin: currentIndex = %d, n = %d, pair = %s.\n", currentIndex, n, pair);
fibonacciSpliterator = new FibonacciSpliterator(n);
long currentFib = pair.getMinusTwo() + pair.getMinusOne();
long nextFib = pair.getMinusOne() + currentFib;
fibonacciSpliterator.pair = new FibonacciPair(currentFib, nextFib);
fibonacciSpliterator.currentIndex = currentIndex + 3;
// System.out.printf("trySplit End: currentIndex = %d, n = %d, pair = %s.\n", currentIndex, n, pair);
}
return fibonacciSpliterator;
}
@Override
public long estimateSize() {
return n - currentIndex;
}
@Override
public int characteristics() {
return ORDERED | IMMUTABLE | NONNULL;
}
}
FibonacciPair:
@RequiredArgsConstructor
@Value
public class FibonacciPair {
private final long minusOne;
private final long minusTwo;
@Override
public String toString() {
return String.format("%d %d ", minusOne, minusTwo);
}
}
उपयोग:
Spliterator<FibonacciPair> spliterator = new FibonacciSpliterator(5);
StreamSupport.stream(spliterator, true)
.forEachOrdered(System.out::print);
यह कोड संकलित नहीं करता है - कृपया सही कोड पोस्ट करें। – OldCurmudgeon
@OldCurmudgeon, आपके पास संकलन त्रुटि क्या है? कोड लंबोक का उपयोग करता है, इसलिए आपको एनोटेशन की भावना बनाने के लिए इसकी आवश्यकता होगी। –