2017-08-26 113 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