2

So as you may be able to tell from my attempt, I'm trying to figure out how I'd make a program which gives the user 5 seconds to enter some lines of text, then the Scanner will count how many lines were entered. I've just started learning Java as my 2nd language, so please try to explain everything as simply as possible :)

I've got two theories as to why it's not working. The first is that nextLine() will return the whole line, regardless of whether it's empty or not meaning rather than NL equaling "", it will actually equal the whole line (ie " "). And my second theory is that I've got no idea what I'm doing and the program flow is all over the place. Anyway, here's my code:

class OrigClass{
    public static void main(String args[]){
        Scanner ScanObj = new Scanner(System.in);
        int Count = 0;
        String NL = ScanObj.nextLine();
        try{
            Thread.sleep(5000);}
        catch (InterruptedException e){
            e.printStackTrace();
        }
        while (!NL.equals("")){
            Count++;
            NL = ScanObj.nextLine();
        }
        System.out.print("You Entered " + Count + " Lines.");
        ScanObj.close();
    }
}

Oh, I forgot to mention hasNext() was what I originally tried:

       import java.util.Scanner;

    class OrigClass{
public static void main(String args[]){
    Scanner ScanObj = new Scanner(System.in);
    int Count = 0;
    try{
    Thread.sleep(5000);}
    catch (InterruptedException e){
        e.printStackTrace();
    }
    while (ScanObj.hasNext() == true){
    Count++;
    ScanObj.nextLine();
    }
    System.out.print("You Entered " + Count + " Lines.");
    ScanObj.close();
}
    }
4

2 回答 2

1

Well this solution is not really good. but works.

public class FiveSecond {
  public static void main(String args[]){
    new Thread(new Count(new Reader())).start();
  }
}
class Count implements Runnable{
  Reader r;Thread t;
  Robot ro;
  public Count(Reader t){this.r=t;
  try {
    ro=new Robot();
  } catch (AWTException e) {e.printStackTrace();}
  }
  @Override
  public void run() {
    t=new Thread(r);
    //t.setDaemon(true); //[S2]
    t.start();
    try{
    Thread.sleep(5000);
    }catch(Exception e){}
    t.interrupt();
    //Implicitly press the enter key in order to release the readLine() method :D
    //not recommended, and it's not a good idea, but works
    ro.keyPress(KeyEvent.VK_ENTER);
    ro.keyRelease(KeyEvent.VK_ENTER);
    /*
     * this is possible to save the strings lines in somewhere in order to access from invoker application
     * or send back the strings by socket, etc . . .
     */
    System.out.println("number of entered lines "+r.getCount()+"\n");
    //you would run this main as a process and get the number of counts 
    //System.exit(r.getCount()); //[S2]
  }
}

class Reader implements Runnable{
  private List<String> lines;
  private volatile int count;
  private BufferedReader br;
  public Reader(){
    lines=new ArrayList<String>();
    br=new BufferedReader(new InputStreamReader(System.in));
  }
  @Override
  public void run() {
    try{String line;
      System.out.println("you have 5 second to detect a 2048 length character, then your system will broken");
      while((line=br.readLine())!=null){
        if(!Thread.currentThread().isInterrupted()){
      count++;lines.add(line);}else{break;}
      }
      //for showing the lines entered
      //System.out.println(lines.toString());
    }catch(Exception ex){}
  }
  public int getCount(){return this.count;}  
}

but the best approach is about running a separated process to count the lines, and you would just remove the [S2] comments to achieve it.

于 2013-07-10T20:16:23.757 回答
1

从它的外观来看,这段代码应该可以工作。我唯一的猜测是您正在手动输入输入并且忘记用CTRL+D. 但是,这样做,NoSuchElementException如果您不使用ScanObj.hasNext().

您还可以使用输入重定向运行您的代码。java OrigClass < data

执行此操作的更好方法如下:

import java.util.Scanner;

public class Sc {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int count = 0;
        String nl; // = scan.nextLine();
        //while (!NL.equals(""))
        while(scan.hasNext())
        {
          count++;
          nl = scan.nextLine();
        }
        System.out.println("Done!  Count: " + count);
        scan.close();
    }
}

这里的区别是我们保存第一个nextLine()直到我们进入 while 循环。这将准确计算输入中有多少行。

只是不要忘记用 表示输入结束CTRL+D

于 2013-07-10T18:31:41.903 回答