【问题标题】:How to continue 2 loops at the same time? [duplicate]如何同时继续 2 个循环? [复制]
【发布时间】:2021-09-05 21:23:36
【问题描述】:

对于this code kata,我需要同时continue 2 个循环。我该怎么做?

public class StringMerger {

    public static boolean isMerge(String s, String part1, String part2) {
        StringBuilder MergedWord = new StringBuilder("");
        String Whole = part1+part2;
        for(int j = 0; j < Whole.length(); j++){
           for(int I = 0; I < part1.length(); I++){
              if((Character.compare(s.charAt(j), part1.charAt(I)) ==  0) && (j == I)){
                  MergedWord.append(s.charAt(I)+"");
                  continue;
              }
              else
                  break;
            }
            for(int i = 0; i < part2.length(); i++){
                if((Character.compare(s.charAt(j), part2.charAt(i)) == 0) && (j == i)){
                    MergedWord.append(part2.charAt(i) + "");
                    continue;
                }
                else
                    break;
            }
        }
        return s.equals(MergedWord.toString())? true : false;
    }
}

我注意到当其中一个 for 循环继续时,它只会继续内部循环,但标签会继续上层循环并且效率低下。我可以同时继续 2 个 for 循环,也就是在这个嵌套的 for 循环中继续内循环和上循环吗?

【问题讨论】:

  • “同时”是什么意思?您是否要继续 j 循环但保留其他循环变量的值?请举例说明从每个循环“双重继续”时 3 个循环变量的值。
  • 喜欢 j++ 和 i/I++
  • 如果我理解正确,你想打破第一个内循环,而不是在第一个满足某些条件后进入第二个内循环。最好的解决方案是使用标志作为执行第二个循环的条件。
  • 在问题本身中总结问题是个好主意。许多人不会去外部链接(随着时间的推移,外部链接会发生变化并变得陈旧,从而使问题对未来的访问者毫无用处)来找出您需要什么。
  • 也许这就是您的意思:developer.com/design/understanding-the-java-labeled-statement,您可以向下滚动到“带有标签的 continue 语句”

标签: java


【解决方案1】:

任务是匹配目标字符串中的每个字符,因此您只需要一个循环,它会遍历字符串中的字符。您确实需要另外两个循环变量来跟踪两个源字符串中有多少已用完。

我下面的解决方案是一次循环三件事:目标字符串和两个“部分”字符串。它在“部分”字符串上移动的速率不是恒定的,但它确实在它们上单调地前进。

我不清楚源字符串是否可以包含目标字符串中未使用的额外字符。由于示例没有显示任何内容,我假设没有。

public class MergedStringChecker {

    public static void main(String[] args) {
        String target = "codewars";
        String part1 = "cdw";
        String part2 = "oears";

        for (int i = 0, p1 = 0, p2 = 0; i < target.length(); ++i) {
            if (p1 < part1.length() && target.charAt(i) == part1.charAt(p1)) {
                ++p1;
            } else if (p2 < part2.length() && target.charAt(i) == part2.charAt(p2)) {
                ++p2;
            } else {
                throw new RuntimeException("No matching characters at index " + i);
            }
        }
    }
}

如果字符串包含 > 16 位代码点,则上述解决方案不是 Unicode 安全的。

【讨论】:

  • 解决了我的问题,但没有找到解决办法
  • 所以我不确定我是否应该投票
  • "codewars" 是否匹配 "cdw""oearsEXTRA"
【解决方案2】:

试试这个。

public static boolean isMerge(String s, String part1, String part2) {
    int length = s.length();
    int length1 = part1.length();
    int length2 = part2.length();
    int i1 = 0, i2 = 0;
    for (int i = 0; i < length; ++i)
        if (i1 < length1 && s.charAt(i) == part1.charAt(i1))
            ++i1;
        else if (i2 < length2 && s.charAt(i) == part2.charAt(i2))
            ++i2;
        else
            return false;
    return i1 == length1 && i2 == length2;
}

public static void main(String[] args) throws IOException {
    System.out.println(isMerge("codewars", "cdw", "oears"));
    System.out.println(isMerge("codewars", "codewars", ""));
    System.out.println(isMerge("codewars", "cdw", "oearsEXTRA"));
}

输出:

true
true
false

【讨论】:

    【解决方案3】:
    • 您在第一部分循环中有错误,您必须从该部分而不是 s 字符追加
    • 您不需要使用初始单词检查零件的 id(删除此检查 (j == I) 和此检查 (j == i)
    • 使用计数器避免循环多次

    试试这个代码:

      public static boolean isMerge(String s, String part1, String part2) {
        StringBuilder MergedWord = new StringBuilder("");
        String Whole = part1+part2;
        int counter1=0;
        int counter2=0;
        for(int w = 0; w < Whole.length(); w++){
            for(int c1 = counter1; c1 < part1.length(); c1++){
                if((s.charAt(w) == part1.charAt(c1))  ){
                    MergedWord.append(part1.charAt(c1)+"");
                    counter1++;
                    continue;
                }
                else
                    break;
            }
            for(int c2 = counter2; c2 < part2.length(); c2++){
                if((s.charAt(w) == part2.charAt(c2)) ){
                    MergedWord.append(part2.charAt(c2) + "");
                    counter2++;
                    continue;
                }
                else
                    break;
            }
        }
        return s.equals(MergedWord.toString())? true : false;
    }
    

    【讨论】:

    • 没有解释的“try-this”类型的答案可能不是最好的答案类型,因为它们对任何人都没有帮助,但可能对原始海报和原始海报有帮助。最好先解释您的解决方案,然后使用代码来说明您要解释的内容。请阅读How to Answer 链接。
    • 当心 tgdavies 的解决方案不适用于:String target = "codewars";字符串 part1 = "cdw"; String part2 = "oearsxxxxxxxxx";
    猜你喜欢
    • 2020-01-02
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2011-08-19
    相关资源
    最近更新 更多