2012-05-13 2 views
3

Если я уже не знаю размер ввода, каков способ продолжения цикла в цикле, пока он не будет доступен, в JAVA. В C++ это можно сделать следующим образом.Сохраняйте петлю до тех пор, пока входные данные не будут доступны в java

int main(){ 
    int val; 
    while(cin >> val){ 
      //do stuff 
    } 
} 

Что способ сделать нечто подобное (как описано выше) в Java

Заранее спасибо. Shantanu

+0

Если я правильно понимаю, что спрашивает, «как сохранить итерацию цикла до тех пор, пока ранее объявленная переменная не инициализируется пользователем через командную строку?» правильно?? – WickeD

ответ

1

Вы должны попробовать следующее.

long val; 
    Scanner sc = new Scanner(System.in).useDelimiter("\n"); 
    while (sc.hasNext()) { 
     String temp = sc.next().trim(); 

     val = Long.parseLong(temp); 
     // do stuff 
    } 
+0

ваш код бросает следующее исключение. Исключение в потоке "основного" java.util.InputMismatchException \t в java.util.Scanner.throwFor (Unknown Source) \t в java.util.Scanner.next (Unknown Source) \t в java.util.Scanner.nextLong (Неизвестный источник) \t at java.util.Scanner.nextLong (Неизвестный источник) – shantanu

+0

вместо sc.nextLong() вы должны использовать nextXXX() то, что вы хотите прочитать – shem

+0

@shem. Я пытался читать долго. Отредактированное решение работает (принимая ввод как строку, затем преобразовывая его в длинный). Благодарю. – shantanu

0

В зависимости от ваших конкретных требований используйте методы класса Scanner. Этот читает целую строку. Это означает, что пользователь должен нажать ввод в большинстве систем.

public static void main(String[] args) 
{ 
    String str=new Scanner(System.in).nextLine(); 
} 
1

Один из способов - использовать сканер.

long val; 
Scanner sc=new Scanner(System.in); 
while (sc.hasNextLong()) { 
    val = sc.nextLong(); 
    // do stuff 
} 

Это эквивалентно предоставленному cpp-коду. Но не совсем то, что вы просили. Он будет зацикливаться до тех пор, пока в считываемой строке есть легальные входы.

0

Не выполняйте циклы занятости. Вы, вероятно, предпочтете использовать потоки. Метод read() потока блокируется до тех пор, пока данные поступают, так что ваш код будет просто без занятых петель и работать именно так, как вы хотите:

while (in.read() != -1) { 
    // do your stuff 
} 

или даже лучше с помощью буфера:

byte[] buf = new buf[MAX_SIZE] 
while (in.read(buf) != -1) { 
    // do your stuff 
} 
+0

Alex. Не могли бы вы также инициализировать ** в переменной **. Я пробовал ваш первый цикл, инициализируя его как «InputStream in = System.in;» и просто вставлял один оператор печати внутри цикла while. Теперь он печатает три раза всякий раз, когда я нажимаю кнопку ввода. – shantanu

0

я считаю, что лучший способ служить вашей цели осуществляется через многопоточность, где один поток будет ждать ввода от пользователя, и пусть другой поток знает, когда он получает один. В то же время другой поток будет продолжать повторять цикл.

Смежные вопросы