Streams
August 25, 2014 6 Comments
I tried to use lambdas to swap elements in the char[] array. Does this mean that I am trying to change the stream while it is streaming ? This code is from http://www.cs.uofs.edu/~mccloske/courses/cmps144/invariants_lec.html but this question is unrelated to those concepts.
If that is a problem then a new stream will do. How should this be done ? I am not looking for a Comparator. I would like to work with this code as it is without using any API but lambdas.
I am printing using lambdas in this code now.
public class DutchNationalFlag { private static final int N = 10; private static char[] flags = new char[]{'R','B','B','R','R','B','B','R','R','B'}; public static void main( String... argv){ new String(flags).chars().mapToObj(i -> (char)i).forEach(System.out::println); int m = 0, k = 0; while (m != N) { if (flags[m] == 'B') { } else { swap(flags,k,m); k = k+1; } m = m+1; } new String(flags).chars().mapToObj(i -> (char)i).forEach(System.out::println); } private static void swap(char[] flags, int k, int m) { char temp = flags[k]; flags[k] = flags[m]; flags[m] = temp; } }
Possible Solution 1:
This doesn’t do exactly what the original code does. It doesn’t swap and doesn’t advance k which is the boundary between ‘B’ and ‘R’.But it produces the result.
Stream<Character> stream1 = IntStream.range(0, flags.length).mapToObj(i -> (char)flags[i]); Stream<Character> stream2 = IntStream.range(0, flags.length).mapToObj(i -> (char)flags[i]); Stream.concat(stream2.filter(x-> (x == 'B')), stream1.filter( y->(y == 'R') )).forEach(System.out::println);