Как остановить время l oop в нужном месте? - PullRequest
0 голосов
/ 03 августа 2020

Мне нужна помощь, потому что я не могу остановиться, пока я oop Я поправил место. В этом примере я хочу удалить последний символ, если строка «seq» будет такой же, как некоторое число в списке (867), чем stop. После нахождения String для добавления их в новый ArrayList более продвинуться вперед, чем пытаться найти остальную часть String (75). Если найден, также введите новый массив. Все лучшие решения очень приветствуются. Спасибо! Список ArrayList может содержать сотни элементов, всего 4, некоторые элементы в списке могут повторяться более одного раза. Найти первым в списке мне подходит на данный момент, если он найден, разделите 86775 на 867: 75. 867 удалить из String seq и добавить в новый ArrayList. Наконец, мы должны также найти 75, если они не существуют, разделить на 7: 5 и попытаться найти 7 и 5. В моем списке всегда существуют отдельные числа, поэтому проблем с исключениями нет. Если вы хотите использовать метод разделения всегда, мне нужно найти как можно большее число, чем если бы не было найдено разделение и удаление последнего, но каждого di git, которое мне нужно. Строка, которую ищет, может содержать даже 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: найдено?: 0 раз 86775 8677 867 <- стоп здесь 86 8 </p>

1 Ответ

0 голосов
/ 03 августа 2020

Чтобы ответить на главный вопрос: как выйти, когда закончите?

Конечно, вы можете сделать это в-l oop с ключевыми словами break или continue. Что я считаю более элегантным, так это использование 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). Это должно решить вашу настоящую проблему намного лучше, чем делать все вручную в циклах.

...