java输入数字后输入多行并输出

项目场景:

参加某五百强企业机考题

1.第一行输入行数;

2.第一行之后开始输入多个数字,空格作为间隔;

3.输入结束后开始读取每一行数据,每次读取的数量为num定义的数量,直到没有数据读取,最后组成一个新的list输出。

输入示例:

3
1 2 3
1 2 3 4 5 6
1 2 3 4

输出示例:

1,2,3,1,2,3,1,2,3,4,5,6,4


问题描述:

当时参考了机考提供的示例题,使用while和hasNextInt实现多行输入,但有换行后自动结束等问题

@Test
public void test03() {
	Scanner input = new Scanner(System.in);
	Integer num = 3;
	Integer arrNum = input.nextInt();
	Map<Integer, List<Integer>> map = new LinkedHashMap<>();
	for (int i = 0; i < arrNum; i++) {
		List<Integer> list = new ArrayList<>();
		while (input.hasNextInt()) {
			list.add(input.nextInt());
		}
		map.put(i, list);
		System.out.println(JSONUtil.toJsonStr(map));
	}
	List<Integer> newList = new ArrayList<>();
	while (!map.isEmpty()) {
		Iterator<Integer> mapIterator = map.keySet().iterator();
		while (mapIterator.hasNext()) {
			Integer key = mapIterator.next();
			List<Integer> list = map.get(key);
			Iterator<Integer> listIterator = list.iterator();
			int i = 0;
			while (listIterator.hasNext() && i < num) {
				newList.add(listIterator.next());
				listIterator.remove();
				i++;
			}
			if (list.size() == 0) {
				mapIterator.remove();
			}
		}
	}

	System.out.println(newList.toString());
}

原因分析:

尝试断点追踪,猜测是hasNextInt方法内的hasNext下的ensureOpen判断错误。


解决方案:

@Test
public void test03() {
	Scanner input = new Scanner(System.in);
	Integer num = 3;
	Integer arrNum = input.nextInt();
	Map<Integer, List<String>> map = new LinkedHashMap<>();
	for (int i = 0; i < arrNum; i++) {
		String str = input.nextLine();
		String[] arrays = str.split(" ");
		List<String> strList = Stream.of(arrays).collect(Collectors.toList());
		map.put(i, strList);
		System.out.println(JSONUtil.toJsonStr(map));
	}
	List<String> newList = new ArrayList<>();
	while (!map.isEmpty()) {
		Iterator<Integer> mapIterator = map.keySet().iterator();
		while (mapIterator.hasNext()) {
			Integer key = mapIterator.next();
			List<String> list = map.get(key);
			Iterator<String> listIterator = list.iterator();
			int i = 0;
			while (listIterator.hasNext() && i < num) {
				newList.add(listIterator.next());
				listIterator.remove();
				i++;
			}
			if (list.size() == 0) {
				mapIterator.remove();
			}
		}
	}

	System.out.println(newList);
}

因为经验不足无法准确找出问题原因,若有知道的欢迎评论区告知。


版权声明:本文为qq_41930336原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。