任何人都可以帮我解释如何从控制台读取多行并将其存储在数组列表中? 例如,我从控制台输入的是:
12 abc place1
13 xyz place2
我在ArrayList中需要这些数据。
到目前为止,我尝试了这段代码:
Scanner scanner = new Scanner(System.in);
ArrayList informationList = new ArrayList<ArrayList>();
String information = "";
int blockSize = 0, count = 1;
System.out.println("Enter block size");
blockSize = scanner.nextInt();
System.out.println("Enter the Information ");
while (scanner.hasNext() && blockSize >= count) {
scanner.useDelimiter("\t");
information = scanner.nextLine();
informationList.add(information);
count++;
}
非常感谢任何帮助。
来自控制台的输入行是字符串和整数的混合
答案 0 :(得分:2)
你遇到了一些问题。
首先,ArrayList的初始化行是错误的。如果你想要一个Object列表,这样你可以同时拥有整数和字符串,你需要将Object
放在角括号内。另外,最好将泛型类型参数添加到变量定义中,而不是仅仅添加到对象实例化中。
接下来,你的计数搞砸了,因为你把它初始化为1而不是0.我假设“块大小”实际上意味着这里的行数。如果那是错的,请发表评论。
接下来,您不想重置扫描程序正在使用的分隔符,并且您当然不希望在循环中执行此分隔符。默认情况下,扫描程序会根据我认为您想要的任何空格来分解令牌,因为您的数据是由制表符和换行符分隔的。
此外,您不需要在while条件下检查hasNext()。所有下一个*()方法都会阻塞等待输入,因此不需要调用hasNext()。
最后,你并没有真正利用Scanner来做它最擅长的事情,即解析令牌到你想要的任何类型。我假设每个数据行都以一个整数开头,然后是两个字符串。如果是这种情况,只需调用nextInt(),然后在循环中调用next(),然后将所有数据解析为自动所需的数据类型。
总结一下,这里是您的代码更新了我的所有建议以及一些其他位,以使其运行:
import java.util.ArrayList;
import java.util.Scanner;
public class Example {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ArrayList<Object> list = new ArrayList<>();
System.out.println("Enter block size");
int blockSize = scanner.nextInt();
System.out.println("Enter data rows:");
int count = 0;
while (count < blockSize) {
list.add(scanner.nextInt());
list.add(scanner.next());
list.add(scanner.next());
count++;
}
System.out.println("\nThe data you entered is:");
System.out.println(list);
}
}