我有以下代码,我想通过system.in给出输入,但是,程序滑动frist输入,但是它读取了第一个,它跳过第三个输入,但它读取第四个,所以上。我无法弄清楚这个问题。 这是我的代码:
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Scanner;
public class problem1a {
private static HashMap<String,Integer> ales;
private static int counter = 0;
private static ArrayList<String> names;
private static ArrayList<String> city;
private static ArrayList<Integer> count;
public static void main(String[] args) throws FileNotFoundException{
Scanner sc = new Scanner(System.in);
// initialize name,line variables
names = new ArrayList<String>();
ales = new HashMap<String,Integer>();
//store the names of the city and the corresponding student
while(sc.hasNextLine() ){
String s = removeNumbers(sc.nextLine());
Integer c = ales.get(s);
if(c == null){
ales.put(s, 1);
}
else{
ales.put(s, c.intValue() + 1);
}
if(sc.nextLine().equals(""))
break;
System.out.println(ales.toString());
}
}
}
所以这是我的输入和输出:
input: 3456345 Delft Jan
input: 435243 Delft Tim
{Delft Jan=1}
input: 54322 Delft Tim
input: 3453455 Delft Tim
{Delft Tim=1, Delft Jan=1}
input: 3456345 Delft Jan
input: 3456345 Delft Jan
{Delft Tim=1, Delft Jan=2}
我解决了问题,问题是根据我在循环中使用sc.nextLine()两次的注释,这就是为什么它会错过第一个输入并读取第二个输入。
新的正确代码就是这样,它运行得很好,谢谢你们。
public static void main(String[] args) throws FileNotFoundException{
Scanner sc = new Scanner(System.in);
// initialize name,line variables
names = new ArrayList<String>();
ales = new HashMap<String,Integer>();
//store the names of the city and the corresponding student
while(sc.hasNextLine() ){
String s = removeNumbers(sc.nextLine());
Integer c = ales.get(s);
if(c == null){
ales.put(s, 1);
}
else{
ales.put(s, c.intValue() + 1);
}
if(s.equals(""))
break;
System.out.println(ales.toString());
}
}
答案 0 :(得分:1)
那是因为你在循环中呼叫sc.nextLine()
两次。
你应该每行只调用一次:
String nextLine = sc.nextLine();
String s = removeNumbers(nextLine);
...
if("".equals(nextLine)) {
break;
}
答案 1 :(得分:1)
while(sc.hasNextLine() ){
String s = removeNumbers(sc.nextLine());
// ...
if(sc.nextLine().equals(""))
break;
}
您在sc.nextLine()
循环内调用while
两次。将nextLine()
分配给变量一次,然后用变量替换循环内的所有调用。像这样:
while(sc.hasNextLine() ){
String line = sc.nextLine();
String s = removeNumbers(line);
// ...
if(line.equals(""))
break;
}
答案 2 :(得分:1)
确实阅读了它们。问题更像是在错误的地方读取一些输入!
String s = removeNumbers(sc.nextLine()); //this line reads the 1st, 3rd, 5th... line
if(sc.nextLine().equals("")) //this line reads the 2nd, 4th, 6th... lines
您应该将读取行分配到String
变量中,并使用它来记住您最后读取的行。实际上,您已经使用s
执行此操作。你试过if(s.equals(""))
吗?
答案 3 :(得分:1)
代码sc.nextLine()
在while循环中执行两次,这是导致问题的根本原因。照顾好这一点,并提供一些必要的机会并继续前进。
while(sc.hasNextLine() ){
String s = removeNumbers(sc.nextLine());
Integer c = ales.get(s);
if(c == null){
ales.put(s, 1);
}
else{
ales.put(s, c.intValue() + 1);
}
if(sc.nextLine().equals(""))
break;
System.out.println(ales.toString());
}