【问题标题】:Java- While loop check if variable changes between two iterationsJava-While循环检查变量是否在两次迭代之间发生变化
【发布时间】:2017-01-30 20:52:28
【问题描述】:

是否有可能检查一个字符串变量自 while 循环的任何两次迭代以来是否发生了变化?

while (true) {    
    String player=json_obj.getString("username");
    System.out.println("Found Player "+player);
}

我的理由是,如果 player 变量在 while 循环的每次迭代之间没有改变,我不想继续打印它。

编辑* 不知道为什么我的帖子会收到反对票,因为这是一个有效的问题。 *

【问题讨论】:

  • 您可以添加一个“上一次迭代中的玩家”变量,与该变量进行比较并在每个迭代步骤后填充。
  • Strings 在 Java 中是不可变的,因此除了更改它指向的对象内存分配段之外,您无法更改它。

标签: java while-loop


【解决方案1】:

player 之前的值保存在另一个变量中,并比较它们:

String oldPlayer="";
while (true) {    
    String player = json_obj.getString("username");
    if (!player.equals(oldPlayer)) {
        System.out.println("Found Player "+player);
        oldPlayer = player;
    }
}

这是假设您的实际循环包含更多逻辑,因为根据您发布的代码,此循环永远不会结束,json_obj.getString("username") 将始终返回相同的值。

【讨论】:

    【解决方案2】:

    关于如何进行此类检查的其他答案是正确的。

    但他们遗漏了一个关键点:你不能像

    那样简单地放下一个while循环
    while (true) {
      String newValue = ...
      if (!newValue.equals(oldValue)) {...
    }
    

    没有睡眠声明!关键是任何现代 CPU 都可以调用该方法来“获取”每秒数以亿计的时间值。但是这样做是没有意义的——因为这只会让你达到 100% 的 CPU 使用率。相反,您应该在这些调用之间留出一些时间。

    除此之外:我只是假设您有其他代码在实际更改这些字符串的其他线程中运行?如果没有,上面的代码将永远循环!

    【讨论】:

      【解决方案3】:

      这很简单:

      String oldValue = "";
      while (true)
      {
          String player=json_obj.getString("username");
          if (!oldValue.equals(player))
          {
              System.out.println("Found Player "+player);
              break; // quit loop when player found?
          }
          oldValue = player
      }
      

      当您尝试等待值更改时,有更好的方法(例如waitnotify)。如果您想这样做,请考虑在每次迭代结束时不要让循环“忙于等待”并进行少量睡眠

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-03
        • 2015-01-02
        • 1970-01-01
        • 1970-01-01
        • 2022-01-27
        • 1970-01-01
        • 2021-05-30
        • 2014-12-12
        相关资源
        最近更新 更多