NomadCoder Ответов: 1

Как исправить это условие while и цикл for


Я пытаюсь выяснить правильный способ программирования цикла while, который должен выйти, как только условие сортировки всех черных шариков в начало массива станет истинным, но может сделать это только с помощью оператора if с инструкцией break.

Вторая проблема-это последний цикл for в методе main, который не должен быть нужен и на самом деле не имеет смысла, но заставляет сортировщик повторять дополнительные разы и исправляет один случай, когда белый мрамор пропускается, но условие того, что все черные шарики находятся в начале, все равно каким-то образом выполняется.

Любая помощь с улучшениями будет оценена по достоинству.
import java.util.Arrays;

public class lostMyMarbles{
    public static void main(String[] args){
        String[] marbles = {"wMarble", "bMarble", "wMarble", "wMarble", "bMarble", "bMarble"};
        //String[] marbles = {"bMarble", "bMarble", "bMarble", "bMarble", "bMarble", "wMarble"};
        //String[] marbles = {"wMarble", "wMarble", "wMarble", "wMarble", "wMarble", "bMarble"};
        //String[] marbles = {"wMarble", "wMarble", "wMarble", "wMarble", "wMarble", "wMarble"};
        //String[] marbles = {"wMarble", "wMarble", "bMarble", "wMarble", "wMarble", "bMarble"};
        
        int counter = 0;
        int newCount = 0;
        for(String element: marbles){
            if(element.equals("bMarble"))
                counter++;
        }
        while(newCount != counter){
            for(int i = 0; i < counter; i++){
                if(marbles[i].equals("bMarble")){
                    newCount++;
                    if(newCount == counter)
                        break;
                }
            }
            if(newCount != counter){
                for(int i = 0; i < counter; i++)
                    sorter(marbles);
            }
        }
        System.out.println(Arrays.toString(marbles));
    }
    public static void sorter(String[] marbles){
        for(int i = 1; i < marbles.length; i++){
                if(marbles[i].equals("bMarble") && (marbles[i-1]).equals("wMarble")){
                    String temp = marbles[i];
                    marbles[i] = marbles[i-1];
                    marbles[i-1] = temp;
                }
        }
    }
}


Что я уже пробовал:

Я пробовал использовать логическое условие и использовать счетчик, который увеличивается внутри цикла для выхода, но кажется, что это условие должно быть выполнено снаружи каким-то образом (проблема области действия?).
Последний цикл for предотвращает один из моих тестовых случаев от предоставления неправильного вывода, даже если условие всех черных шариков, находящихся в начале, выполняется... но я не могу вспомнить, почему я положил его туда, чтобы начать с".;

1 Ответов

Рейтинг:
2

Richard MacCutchan

newCount никогда не может сравниться counter, потому что второй for цикл сравнивает только первый counter строки, поэтому он будет видеть только одну со значением "bMarble". Вы должны повторять полный список каждый раз.