2014-11-15 5 views
-1

У меня есть программа, которая считывает строки из консоли и сохраняет строки в случайных индексах массива String. Но проблема в том, что программа постоянно запрашивает ввод и не останавливается. Это моя программа.Сканер не останавливается от чтения ввода

private static Scanner sc; 
public static void main(String[] args) { 


    String[] arr = new String[10]; 
    sc = new Scanner(System.in); 
    String line; 
    Random rn = new Random(); 

    for(int x = 0; x < 10; x++) { 
     line = sc.nextLine(); 
     System.out.println(line); 
     int i = rn.nextInt(9); 

     while(arr[i] != null) { 
      i = rn.nextInt(9); 
     } 

     arr[i] = new String(line); 
    } 
    for(int x = 0; x < 10; x++) { 
     System.out.println(arr[x]); 
    } 
    sc.close(); 
} 

Также после 10 входы System.out.println(line); после чтения также не печатает. Может ли кто-нибудь помочь мне найти проблему с моей программой.

ответ

4

Читаешь 10 строк:

for(int x = 0; x < 10; x++) { 
    line = sc.nextLine(); 

И вы пытаетесь сохранить эти 10 строк в 9 различных показателей вашего массива:

i = rn.nextInt(9); 

Так, очевидно, вы запустите ad vitam aeternam, чтобы найти доступный индекс для своей 10-й линии.

Отметьте, что new String(line) бесполезна. Строки неизменяемы. Таким образом, вы можете безопасно хранить линию.

Кроме того, ваша стратегия неэффективна: вы будете циклически снова и снова, пока не найдете доступный индекс. Лучшая стратегия была бы заполнить список строк, в порядке, а затем перетасовать ее, когда она содержит 10 строк, с Collections.shuffle():

String[] arr = new String[10]; 
sc = new Scanner(System.in); 

for(int x = 0; x < 10; x++) { 
    arr[x] = sc.nextLine(); 
} 
Collections.shuffle(Arrays.asList(arr)); 

System.out.println(Arrays.toString(arr)); 
3

Это потому, что в цикле while он говорит, что этот элемент в вашем массиве НЕ равен нулю. Поэтому, поскольку он не будет равен нулю, он будет работать бесконечно. Вы должны изменить его

while(arr[i] == null) { 
    i = rn.nextInt(9); 
    } 
+0

+1. Я не заметил неправильный тест. Но даже при правильном тестировании он все равно приведет к бесконечному циклу. –

+0

Да, ваш ответ тоже верен, я тоже этого не видел. Если вы интегрируете свой ответ с моим, наоборот, или просто сохраните его так? – PsyCode

+0

Держите это так. –

0

Если вы хотите присвоение массива (обры) путем ввода в десять раз от консоль, вы должны изменить (int i = rn.nextInt (9)) и (i = rn.nextInt (9);) to (int i = rn.nextInt (10)) и (i = rn.nextInt (10) ;), потому что rn.nextInt (9) генерирует случайное целое число [0, 9), поэтому при x = 9 ваша программа не может выйти из цикла while, и вы вводите что-либо бесполезно (не может остановиться)!

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