【问题标题】:How to stop a while loop in correct place?如何在正确的位置停止while循环?
【发布时间】:2020-11-23 19:20:56
【问题描述】:

我需要帮助,因为我无法在正确的位置停止 while 循环。 在此示例中,只要字符串“seq”与列表中的某个数字(867)相同,我想删除最后一个字符,然后停止。

更高级的是,在找到 String 之后,将它们添加到新的 ArrayList 中,然后尝试找到 String 的其余部分(75)。如果找到,也输入到新的数组中。

非常欢迎所有更好的解决方案。谢谢!

ArrayList 列表可以包含数百个元素,只有 4 个,列表中的某些元素可以重复多次。目前在列表中查找第一个对我来说很好。如果找到,将 86775 拆分为 867:75。从 String seq 中删除 867 并添加到新的 ArrayList。最后,我们必须找到 75 - 如果它不存在,则拆分为 7:5,并尝试找到 7 和 5。在我的列表中,单个数字始终存在,因此没有异常问题。

如果您想始终使用拆分方法,我需要尽可能找到更大的数字,然后如果没有找到拆分并删除最后一个,但我需要每个数字。

正在检查的字符串可以有 20 个或更多字符。这是最简单的例子。

我一直在寻找很多方法来解决这个问题,但我不确定这是最好的。

public class Main {
    public static void main(String[] args) {

        List<String> list = new ArrayList<String>();
        list.add("567");
        list.add("867");
        list.add("86");
        list.add("75");
        System.out.println(list);
        String seq = "86775";
        System.out.println(seq + ": found ?: " + getPatternFound(String.valueOf(list), seq) + " times");
        int nbChar = 0;
        do {
            getRemoveLastChar(seq, 1);
            if (getPatternFound(String.valueOf(list), seq) == 0) ;
            getRemoveLastChar(seq, 2);
            nbChar++;
            System.out.println(getRemoveLastChar(seq, nbChar));

        }
        while (nbChar < seq.length());

    }

    private static String getRemoveLastChar(String str, int nbChar) {
        return str.substring(0, str.length() - nbChar);
    }

    private static int getPatternFound(String longString, String pat) {
        Pattern pattern = Pattern.compile(pat);
        Matcher matcher = pattern.matcher(longString);
        int count = 0;
        while (matcher.find())
            count++;
        return count;
    }
}
[567, 867, 86, 30]
867755: found ?: 0 times
86775
8677
867 <- stop here
86
8

【问题讨论】:

  • 如果你确实想停止一段时间,那么你总是可以使用一个标志,当你想停止一段时间时,一些布尔值将是错误的
  • 请举一个更详细的例子,哪个变量包含哪个值,为什么要继续或停止,输入和预期输出是什么
  • @vmrvictor 代码中已经存在的输入。只是显示的输出格式不正确。
  • 对不起,我无法理解您的期望以及输出中的不正确之处
  • 如果我正确理解了这个问题,getPatternFound(String.valueOf(list), seq) 应该返回列表中的值(表示为字符串)与seq 匹配的次数。当它返回 0 时,循环继续。所以getPatternFound 没有正确实现。

标签: java loops arraylist while-loop char


【解决方案1】:

回答主要问题:完成后如何退出?

当然,您可以使用 breakcontinue 关键字进行循环。 我认为更优雅的是在单独的方法中使用return。 如果您以后有更改,它会使代码更容易理解。

这是一个显示您所说的行为的实现:

import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {

        ArrayList<String> list = new ArrayList<String>();
        list.add("567");
        list.add("867");
        list.add("86");
        list.add("75");
        System.out.println("List = " + list);
        String seq = "86775";

        String result = search(list, seq);

    }

    /**
     * 
     * @param list
     * @param seq
     * @return null means no match;
     */
    private static String search(ArrayList<String> list, String seq) {
        while (seq.length() > 0) {
            System.out.println("analyzing seq: " + seq);

            boolean broken = false;
            for (String s : list) {
                if (seq.contentEquals(s)) { // if matched

                    System.out.println("found match: " + s);
                    // do your logic, for example
                    seq = seq.replace(s, "");

                    // quit the loop at right place
                    return s;
                }
            }
            seq = seq.substring(0, seq.length() - 1);

        }
        return null;
    }

}

生成输出:

List = [567, 867, 86, 75]
analyzing seq: 86775
analyzing seq: 8677
analyzing seq: 867
found match: 867

阅读您想用它做什么时:String API 提供 String.contains(String infix)String.replace(String old, String new) 的组合。这些应该比在循环中手动执行所有操作更好地解决您的实际问题。

【讨论】:

  • 嗯。我认为String.contains()可能对你有很多好处。创建一个循环,在其中迭代列表的所有元素并检查seq 是否包含该元素,如果是,则对其进行操作,如果否,则让循环结束。或者你可以玩String.indexOf( another_String)String.replaceFirst(regex, replacement)
猜你喜欢
  • 2010-09-26
  • 2013-09-11
  • 2023-01-10
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 2018-10-14
  • 2020-09-02
  • 1970-01-01
相关资源
最近更新 更多