2017-02-08 2 views
0

Этот код пытается принять ключи от пользователя и хранить их в массиве строковых данных. Позже в программе значение для каждого ключа отображается в определенном формате.Как я могу выйти из этого цикла?

Во-первых, я хочу, чтобы этот цикл завершался/выходил, когда пользовательский ввод пуст/следующая строка. Я не хочу использовать любой символ или строку EOF для выхода из цикла.

Я сделал несколько поисков по предыдущим SO-вопросам/решениям, но не работал в моем случае. Нужна помощь в сортировке этой проблемы или любых других альтернативных вариантах.

Заранее благодарен!

class DictionaryAndMap{ 
    public static void main(String[] args){ 
    Scanner sc = new Scanner(System.in); 
    int len = sc.nextInt(); 
    Map<String, Integer> mp = new HashMap<String, Integer>(); 
    String name; 
    int phone; 
    for(int i=0; i<len; i++){ 
     name = sc.next(); 
     phone = sc.nextInt(); 
     mp.put(name, phone); 
    } 
    int i=0; 
    String arr1[] = new String[10]; 
    String nam; 

// I couldn't exit out of this loop 
    while(sc.hasNext()){ 
     nam = sc.next(); 
     if(nam!=null && !nam.trim().isEmpty()){ 
     arr1[i] = nam; 
     i++; 
     } 
     else{ 
     break; 
     } 
    } 

// iterating through the array to find the search inputs 
    for(String j: arr1){ 
     if(mp.containsKey(arr1[j])){ 
     System.out.println(j+"="+mp.get(j));   
     }else{ 
     System.out.println("Not found"); 
     } 
    } 
    } 
} 

P.S. Значение hasNext() не изменяется на false, даже если вход пуст/null/"", поэтому цикл while никогда не заканчивается. Как я могу заставить hasNext() обнаружить любой из этих пустых входных данных и, следовательно, он может выйти из цикла?

+0

Это утверждение 'else if' является избыточным. Он всегда будет «истинным», когда первый «if» будет «false». – 4castle

+0

http://stackoverflow.com/a/10490358/7187887 –

+0

Я столкнулся с этой нитью, но разве нет решения для этого, кроме использования инструкции EOF? Есть ли способ, по крайней мере, я могу отслеживать \ n из пользовательского ввода или что-то в этом роде? – Akhil

ответ

1

Просто проверьте входной порожняком после прочтения его:

while (scanner.hasNextLine()) { 
    nam = sc.nextLine(); 
    if (nam.trim().isEmpty()) 
     break; 
    ... 

Вы можете упростить остальное, заменив else if только else и удалить последнюю else.

+0

Нет, сэр. hasNext() не обнаруживает пустые/нулевые пользовательские входы. Я пробовал null, "", пуст ... к сожалению, ни одна из этих работ не работает :( – Akhil

+0

@Akhil: на самом деле следующий колодец ждет следующего токена, поэтому всегда возвращайте непустую строку. Возможно, вы захотите переключиться на hasNextLine() и nextLine(). Сканер обновлен. –

+0

, когда я использую hasNextLine(), элемент управления ищет вход в той же строке (т. е. предыдущую строку, где он берет ввод пользователем пары ключ-значение) ... поэтому, когда я нажмите Enter после этого, он прерывает управление из цикла. – Akhil

1

вы должны проверить строку, если пустой или нулевой перерыв так управление выходит из цикла в то время как

nam=sc.next(); 
if(name==null || name.isEmpty()){ 
break; //break the loop 
} 
+0

Нет сэр. hasNext() isn ' t обнаруживает пустые/нулевые пользовательские входы. Я пробовал null, "", пуст ... к сожалению, ни одна из этих работ не работает :( – Akhil

0

этот код может помочь вам. Вы не нужно проверить ! Mp.containsKey (нм)

while(sc.hasNext()){ 
nam = sc.next(); 

if(mp.containsKey(nam)){ 
    arr1[i] = nam; 
    i++; 
} 
else { 
    System.out.println("Not found"); 
} 
+0

Никоим образом это не сработает. Я использовал! mp.containsKey (nam) только потому, что я мог различать пустой/null ввод – Akhil

+0

если (mp.containsKey (nam) &&! na m.trim().isEmpty()) добавьте это в ваше состояние –

+0

nah Я попробовал все эти ... не работает вообще – Akhil

1

Я думаю, что это код, который вы ищете

public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 
    String nam; 
    Map<String, Objects> mp = new HashMap<>(); 
    String[] arr1 = new String[1024]; 
    int i = 0; 
    nam = sc.nextLine(); 

    while (nam.length() > 0) { 

     if (mp.containsKey(nam)) { 
      arr1[i] = nam; 
      i++; 
     } else { 
      System.out.println("Not found"); 
     } 
     nam = sc.nextLine(); 
    } 
} 

Loop будет прекращено, нажав ввести с пустой строкой.

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