Java:在不知道输入行数的情况下读取输入

时间:2017-09-26 19:28:26

标签: java input java.util.scanner

这可能是非常基本的,或者可能是我完全缺失的东西。我已经开始在线渠道进行一些有竞争力的编程。我必须读取逗号分隔的字符串并对其进行一些操作,但问题是我不知道输入行的数量。以下是输入示例

输入1

John,Jacob
Lesley,Lewis
Remo,Tina
Brute,Force

输入2

Hello,World
Java,Coder
........
........
//more input lines
Alex,Raley
Michael,Ryan

我正在尝试读取输入并在遇到行结束但没有运气时中断。这就是我一直在尝试的

//1st method
Scanner in = new Scanner(System.in);

do{
    String relation = in.nextLine();
    //do some manipulation
    System.out.println(relation);

}while(in.nextLine().equals(""));   //reads only first line and breaks

//2nd method
Scanner in = new Scanner(System.in);
while(in.hasNext()){
    String relation = in.next();
    System.out.println(relation);
    if(relation.equals("")){
        break;
    }
}

//3rd method
Scanner in = new Scanner(System.in);
while(true){   //infinite loop
    String relation = in.nextLine();
    System.out.println(relation);
    if(relation.equals("")){
        break;
    }
}

有人可以帮忙吗。

PS:请不要判断。我是竞争性编程的新手,虽然我知道如何在java中获取用户输入以及next()和nextLine()之间的区别。

4 个答案:

答案 0 :(得分:2)

应该相当容易。试试

while(in.hasNextLine()){
    String relation = in.nextLine();
    if("exit".equalsIgnoreCase(relation))break;
    //do some manipulation
    System.out.println(relation);    
}

方法Scanner#hasNextLine只是检查输入中是否有下一行,但是没有真正推进扫描程序。另一方面,Scanner#nextLine读取输入并推进扫描仪。

更新您可能希望放置一些条件退出循环。例如。上面的片段在遇到字符串“exit”后停止读取更多输入。

答案 1 :(得分:2)

我不会写为什么你不应该使用Scanner。有很多文章为什么你不应该在竞争性编程中使用Scanner。而是使用BufferedReader

在竞争性编程中,他们将输入重定向到文件中的代码。

例如,它就像./a.out > output.txt < input.txt一样。

因此读取直到在while循环中检测到null。

public static void main(String args[] ) throws Exception {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String s;
        while((s = br.readLine()) != null)
        {
            //System.out.println(s);
        }
    }

要通过键盘进行测试,请从键盘模拟null

Ctrl + D 。它将突破上面的while循环。

答案 2 :(得分:0)

除了上述两种方法外,我还有另一种解决此问题的方法。看看下面的代码,你可以抓住NoSuchElementException来解决这个问题。

import java.util.*;

public class Program
{
    public static void main(String[] args) 
    {
        Scanner sc = new Scanner(System.in);


        try   
        {
            while(true)
             String    a=sc.next();
            System.out.print(a);

        }
        catch(NoSuchElementException  k)
        {
        }


    }
}

答案 3 :(得分:0)

你所有的方法都可以改进。

但是让我们考虑一下 while 循环的第二种方法。

Scanner in = new Scanner(System.in);
    String s;

    while(in.hasNext()){
        s=in.nextLine();
        System.out.println(s);
       
    }

同样,您可以更改每个代码。 您也可以使用 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 来缓冲您的输入,然后检查 in.readLine()) != null