同一Java文件内如何将已打印的输出作为后续代码的输入
实现方案
方案1:直接复用已生成的随机数组(推荐)
你前面执行完洗牌逻辑后,numbers数组已经存储了完整的0~n-1随机排列结果,完全不需要走输入流中转,直接遍历数组做统计即可,改动量最小、运行效率最高:
public class Bonus1{ public static void main(String[] args) { int n = Integer.parseInt(args[0]); int[] numbers = new int[n]; for (int i = 0; i < n; i++ ) { numbers[i] = i; } // 洗牌算法生成随机排列 for (int i = 0; i < n; i++ ) { int r = i + (int)(Math.random() * (n - i)); int tmp = numbers[i]; numbers[i] = numbers[r]; numbers[r] = tmp; System.out.print(numbers[i] + " "); // 加空格分隔方便查看排列 } System.out.println(); int min = Integer.MAX_VALUE; int count = 0; // 直接遍历已有的数组做统计,替换原有外部输入读取逻辑 for (int y : numbers) { if(y < min){ min = y; count += 1; } } System.out.println(count); } }
运行java Bonus1 10就会先打印0-9的随机排列,再输出新最小值的统计次数,完全符合需求。
方案2:重定向标准输入(兼容原有Scanner逻辑)
如果你不想修改原来基于Scanner的统计代码,可以把洗牌后数组的内容转成字节流,重定向到System.in再供给Scanner读取:
import java.util.Scanner; import java.io.ByteArrayInputStream; public class Bonus1{ public static void main(String[] args) { int n = Integer.parseInt(args[0]); int[] numbers = new int[n]; for (int i = 0; i < n; i++ ) { numbers[i] = i; } StringBuilder sb = new StringBuilder(); // 洗牌算法生成随机排列 for (int i = 0; i < n; i++ ) { int r = i + (int)(Math.random() * (n - i)); int tmp = numbers[i]; numbers[i] = numbers[r]; numbers[r] = tmp; System.out.print(numbers[i] + " "); sb.append(numbers[i]).append(" "); // 把排列内容暂存 } System.out.println(); // 重定向标准输入 ByteArrayInputStream in = new ByteArrayInputStream(sb.toString().getBytes()); System.setIn(in); Scanner data = new Scanner(System.in); int min = Integer.MAX_VALUE; int count = 0; // 原有统计逻辑完全不需要修改 while(data.hasNext()){ int y = data.nextInt(); if(y < min){ min = y; count += 1; } } System.out.println(count); } }
内容的提问来源于stack exchange,提问作者fredrik
相关产品推荐
相关产品推荐

