2017-08-26 112 views
3

我需要从stdin读取整数列表,并将它们变成java.awt.Point(x,y)数组。如何将整数流转换为java.awt.Point?

输入的格式是X Y X Y X Y ...

我能做到这一点的非流路这样,

Scanner scanner = new Scanner(System.in).useDelimiter("\n"); 
String[] input = scanner.next().split("\\s+"); 
Point[] points = new Point[input.length/2]; 
for (int i = 0; i < input.length/2; i++) { 
    points[i] = new Point(Integer.parseInt(input[2*i]), 
     Integer.parseInt(input[2*i+1])); 
} 

但是我怎么也使用流呢?我被卡在map()

List<Point> points = Arrays.stream(scanner.next().split("\\s+")) 
    .map(Integer::parseInt).map(??).collect(Collectors.toList()); 

在此先感谢。

回答

4

既然你想利用两个项目在每个步骤中的数据流,因为你不知道会是怎样流提前,你可以做的两个步骤:

Scanner scanner = new Scanner(System.in).useDelimiter("\n"); 

List<Integer> integers = Arrays.stream(scanner.next().split("\\s+")) 
     .map(Integer::valueOf) 
     .collect(Collectors.toList()); 

List<Point> points = IntStream.range(1, integers.size()) 
     .filter(x -> x % 2 == 1) // in order to not repeat elements 
     .mapToObj((i) -> new Point(integers.get(i-1), integers.get(i))) 
     .collect(Collectors.toList()); 

System.out.println(points); 

OUTPUT

1 2 3 4 5 6 7 8 
[java.awt.Point[x=1,y=2], java.awt.Point[x=3,y=4], java.awt.Point[x=5,y=6], java.awt.Point[x=7,y=8]] 
+0

如果我事先知道标准输入的整数个数,它会起作用吗? – user5245796

+2

@ user5245796如果您有整数列表,您可以跳过第一部分(将其从字符串读取并转换为整数)并直接转到第二部分。 – alfasin

+0

我知道有多少个整数,但不知道它们是什么,直到它们从标准输入读取。猜猜我仍然需要两个步骤。谢谢。 – user5245796