【问题标题】:Is there a cleaner way than while (1) ... break;?有没有比 while (1) ... break; 更清洁的方法?
【发布时间】:2012-09-01 02:41:08
【问题描述】:

此应用程序匹配两个单词列表,一个在字典文件中,一个由应用程序在 TreeSet 中生成。也许有更好的方法可以做到这一点,但这超出了这个问题的范围——我们使用的方式是从文件中读取一行,从 TreeSet 中读取一行,比较它们并

如果 TreeSet 行等于文件行则保存

如果 TreeSet 行 > 文件行,则从文件中读取一行

如果文件行 > TreeSet 行,则从 TreeSet 中读取一行

在伪代码中:

while (1) {
    String dict = reader.readLine();
    if (dict == null || !TreeIterator.hasNext()) break;
    if (dict.equals(TreeIterator.next())...save
    elseif > .... read tree
    elseif < .... read file
}

使用 while (1) 似乎不正确,但我没有找到更简洁的方式来表达这种双重条件。 没有办法读取 while 条件中的两个字符串,是吗? 是否有可能保持这种方法的简单性(不再混乱),同时又失去了奇怪的 while(1)?

最好的问候。

【问题讨论】:

    标签: java


    【解决方案1】:

    首先,while(1) 在 Java 中是无效的。你需要while(true)。我个人倾向于这样处理:

    String line;
    while ((line = reader.readLine()) != null && TreeIterator.hasNext())
    {
        ...
    }
    

    虽然我通常不喜欢条件中的副作用,但这种“获取下一个并检查它是否确实存在”的方法非常普遍,以至于正常的可读性问题不是 IME 的问题。

    【讨论】:

    • 好的,谢谢 - 这正是我想要的,但我完全不确定 (line = reader.readLine()) != null) 成语。非常感谢!
    • 因为这是公认的答案。使用for 循环的好处是限制了行的范围,这总是好的和整洁的。
    【解决方案2】:

    你可以写

    for(String dict; TreeIterator.hasNext() && (dict=reader.readLine()) != null; ) {
        if (dict.equals(TreeIterator.next())...save
        elseif > .... read tree
        elseif < .... read file
    }
    

    我不确定这是否更清洁。

    【讨论】:

    • +1 这样做的好处是dict 变量不会泄漏到外部作用域中。
    • 使用delcared... while(declared) 确实很蹩脚,'for' 一直循环,它们可能更加狡猾。也没有其他人注意到:iterator.hasNext() 应该在 readLine() 之前以避免潜在的不需要的 IO :)
    【解决方案3】:

    是的。试试

    String dict;
    while ( (dict = reader.readLine()) != null && TreeIterator.hasNext() )
    

    【讨论】:

      【解决方案4】:

      这个怎么样(伪代码):

      String dict = reader.readLine();
      while (dict != null && TreeIterator.hasNext()) {
          if (dict.equals(TreeIterator.next())...save
          elseif > .... read tree
          elseif < .... read file
          dict = reader.readLine();
      }
      

      【讨论】:

      • 这将忽略dict 的第一行,因为您调用了两次readLine
      • @JonSkeet 已修复,谢谢。我忘了删除循环内的第一个 readLine()
      【解决方案5】:

      您可以将 while 替换为您的中断条件:

      String dict;
      while((dict = reader.readLine()) != null && TreeIterator.hasNext())
      

      这样停止条件的可读性会好很多

      【讨论】:

      • 永远不会进入循环,因为 dict 还没有被初始化,如果那是直接替换的话。
      • 这不包括它,在比较 dictnull 之前,您需要初始的 dict = reader.readLine();
      • dict 应该在进入循环之前被初始化。仍然不正确。
      猜你喜欢
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 2013-10-17
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多