项目场景:
参加某五百强企业机考题
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);
}