【问题标题】:How can I exit out of this loop?我怎样才能退出这个循环?
【发布时间】:2017-06-25 13:13:09
【问题描述】:

此代码试图从用户那里接受密钥并将它们存储到字符串数据数组中。稍后在程序中,每个键的值以某种特定格式显示。

首先,我希望这个循环在用户输入为空/下一行时结束/退出。我不想使用任何 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. 即使输入为空/null/" ",hasNext() 值也不会更改为 false,因此 while 循环永远不会结束。我怎样才能让 hasNext() 检测到任何这些空输入数据,因此它可以退出循环?

【问题讨论】:

  • else if 声明是多余的。只要第一个 iffalse,它就永远是 true
  • 我确实遇到了那个线程,但是除了使用 EOF 语句之外没有其他解决方案吗?有没有办法至少我可以从用户输入或类似的东西中跟踪 \n?
  • @Akhil 使用hasNext() here 可能会有帮助。
  • ^ 这几乎指出了我的问题...也许我应该尝试不同的方法:)

标签: java loops collections hashmap iteration


【解决方案1】:

阅读后检查输入是否为空:

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

然后,您可以通过仅将 else if 替换为 else 并删除最后一个 else 来简化其余部分。

【讨论】:

  • 不,先生。 hasNext() 未检测到空/空用户输入。我试过 null, " " , empty...不幸的是这些都不起作用:(
  • @Akhil :实际上下一个很好地等待下一个令牌,所以总是返回非空字符串。您可能想要切换到 hasNextLine() 和 nextLine() 。扫描仪已更新。
  • 当我使用 hasNextLine() 时,控件正在同一行中搜索输入(即,它采用键值对的用户输入的上一行)...所以,当我之后按回车键,它打破了循环控制。
  • 我已经更新了查询中的代码。请查看它以了解为什么 nextLine() 不起作用
【解决方案2】:

您必须检查字符串是否为空或空中断,以便控制脱离 while 循环

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

【讨论】:

  • 不,先生。 hasNext() 未检测到空/空用户输入。我试过 null, " " , empty...不幸的是这些都不起作用:(
【解决方案3】:

此代码可能会对您有所帮助。您无需检查 !mp.containsKey(nm)

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

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

【讨论】:

  • 这行不通。我使用 !mp.containsKey(nam) 只是因为我可以区分空/空输入
  • if(mp.containsKey(nam) && !nam.trim().isEmpty()) 在你的条件下添加这个
  • 你真正想做什么??
  • 要清楚,当用户输入为“空”或按下简单的“输入按钮”时,我只想退出该 while 循环
  • 然后添加中断;在其他部分
【解决方案4】:

我认为这是您要查找的代码

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();
    }
}

循环将被空字符串按回车终止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多