【问题标题】:How to Limit while (iterator.hasNext()) iterations?如何限制 while (iterator.hasNext()) 迭代?
【发布时间】:2018-04-29 20:01:10
【问题描述】:

我正在使用 Generex 库开发 Java,以针对给定的正则表达式打印字符串

有些 R.E 可以生成无限字符串,我只想处理它们,但还不能。 我的代码看起来像;

Generex generex = new Generex(regex);
Iterator iterator = generex.iterator();
    System.out.println("Possible strings against the given Regular Expression;\n");
    while (iterator.hasNext()) {
        System.out.print(iterator.next() + " ");
    }

如果我输入 (a)* 作为正则表达式,输出应该是这样的

a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa ...

如何限制该循环的结果?

【问题讨论】:

  • 标准是什么?
  • 您是否尝试过维护计数器?例如,int maxIterations = 10; while(iterator.hasNext()) && maxIterations-- > 0) { … }。如果您不想创建长度大于 N 的字符串,您可以提出类似的解决方案。
  • 我知道了。有帮助。 :)
  • 正则表达式的标准是仅使用 {a,b,(,),*}。针对每个 R.E,可能或如果无限一些字符串被打印左右..

标签: java netbeans while-loop infinite-loop


【解决方案1】:

假设您希望打印前 8 个项目,如果要打印更多项目,则添加 "..."。你可以这样做:

int limit = 8;
int current = 0;
while (iterator.hasNext()) {
    if (current != 0) {
        System.out.print(" ");
    }
    System.out.print(iterator.next());
    // If we reach the limit on the number of items that we print,
    // break out of the loop:
    if (++current == limit) {
        break;
    }
}
// When we exit the loop on break, iterator has more items to offer.
// In this case we should print an additional "..." at the end
if (iterator.hasNext()) {
    System.out.print(" ...");
}

【讨论】:

  • 使用'&&'而不是使用'break'将限制比较放入while条件
  • @boly38 这是另一种选择,是的。我决定放一个break,因为在某种程度上,限制逻辑与“主要”迭代停止逻辑是分开的,但这是个人喜好问题。
【解决方案2】:

在您的情况下,我认为字符串的长度比打印的元素数量重要得多,所以我会说以下解决方案可能更好:

Generex generex = new Generex(regex);
Iterator iterator = generex.iterator();
System.out.println("Possible strings against the given Regular Expression;\n");
StringBuilder sb = new StringBuilder();
int limitOfChars = 100; //for example
while (iterator.hasNext()) {
    String next = iterator.next();
    if (sb.length() + next.length() > limitOfChars) break;
    sb.append(next + " ");
}
System.out.println(sb.toString() + " ... ");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-06
    • 2012-02-03
    • 2023-03-16
    • 2015-06-08
    • 2017-09-08
    • 2021-02-18
    • 2016-07-06
    相关资源
    最近更新 更多