【问题标题】:add additional parameters to foreach loop向 foreach 循环添加附加参数
【发布时间】:2014-03-01 12:46:46
【问题描述】:

我有一个 foreach 循环

boolean doesWordMatch = false;
for(Character[] charArr : charSets)
{
  if(doesWordMatch)
    //dosomething
  else
    break;
}

我想知道,有没有办法将条件放入 for 循环中?例如

for(Character[] charArr : charSets && doesWordMatch == true)
{
  //dosomething
}

edit-- 是的,那么这可能在 while 循环中实现吗? :o

【问题讨论】:

  • 你循环的是一个集合而不是一个条件
  • 没有增强的while循环,所以任何人都可以猜测你的想法。
  • 在这种情况下为什么要在 for 循环中调用条件?

标签: java loops for-loop foreach traversal


【解决方案1】:

不,这不能在增强的 for 循环中完成

您可以尝试以下方法:

for (Character[] charArr : charSets) {
    if (!doesWordMatch) {
        break;
    }
    //do interesting things
}

我相信这也比在循环声明中包含所有内容更简洁。

【讨论】:

  • 这基本上是OP的第一个例子,你注意到了吗?
  • 认为他的意思是它比 if() {} else {} 更整洁 :D 我想知道——那么这在 while 循环中是否可行?
  • @MarkoTopolnik 我看到了根本的不同。我相信 OP 想要做的是将所有内容都包含在 if-else-statements 中,从而导致更多条件下的代码混乱。我的建议是在有趣的事情开始发生之前将布尔检查向前推进。
  • @GwenWong 我看不出有什么好办法。
  • 我承认这可能是他(她?)代码中困扰 OP 的一个(较小)方面。
【解决方案2】:

如果您只想将“if”块排除在 for 循环之外,那么您可以使用老式的方式。

Iterator<Character[]> i=charSets.iterator();
for(Character[] charArr=i.next(); i.hasNext() && doesWordMatch == true; charArr=i.next() ) {
        // do something
}

【讨论】:

  • 这个 sn-p 对空集合不健壮,但如果 OP 想要将额外条件内联到他们的 for 循环中,我同意使用迭代器和标准 for 循环的建议检查。
【解决方案3】:

如果您想要创建charArrdoesWordMatch 之间的映射:

Map<Character[], Boolean> map = new HashMap<>();
map.put(charArr, doesWordMatch);

for(Map.Entry<Character[], Boolean> myEntry : map.entrySet()) {
    if(myEntry.getValue()) {
        // do something with myEntry.getKey();
    } else {
        break;
    }
}

我不确定这是否是您要查找的内容,但我想不出任何其他原因让 doesWordMatch 变量进入循环。在这种情况下,每个charArrdoesWordMatch 可以不同。

【讨论】:

    【解决方案4】:

    使用迭代器和标准 for 循环以及空白增量语句:

    Character[] curr;
    for(Iterator<Character[]> iter = charSets.iterator(); iter.hasNext() && doesWordMatch;) {
      curr = iter.next();
      // ...
    }
    

    【讨论】:

      【解决方案5】:

      布尔变量doesWordMatch会在for循环中改变吗?

      如果没有,我会建议:

      if(doesWordMatch)
        for(Character[] charArr : charSets)
        {
          //dosomething
        }
      }
      

      【讨论】:

      • 我坚信 doesWordMatch 在迭代过程中会发生变化,否则恕我直言,这整个问题毫无意义。
      • 我不是在问你,我是在问 OP。如果你是正确的,你上面的建议不是很好,如果你知道你不应该进入 for 循环,为什么还要进入呢?
      • @skiwi 为什么仅仅因为我有一个问题你认为你有答案,你就拒绝一个比你更好的建议?
      • 我没有对你投反对票,请自行保留你的 cmets。
      猜你喜欢
      • 1970-01-01
      • 2019-09-14
      • 2011-09-15
      • 1970-01-01
      • 2017-12-22
      • 2019-05-02
      • 2019-09-23
      • 1970-01-01
      • 2021-11-01
      相关资源
      最近更新 更多