Java-массив, вложенный для циклов, не очищая второй для возврата к первому

#java #arrays #for-loop

#java #массивы #for-цикл

Вопрос:

Циклы for в приведенном ниже коде сначала перебирают записи пользователя, а затем проверяют количество пробелов » » в строке. После проверки через них задается вопрос, хотят ли они отображать строки без пробелов, один или более. Я не думаю, что цикл проходит мимо первого экземпляра цикла for, поскольку второй должен искать значение 0 в переменной count . Ниже приведены вложенные циклы for:

      if(answer.equals("No")){
        
        for (int i = 0; i < array.length;i  ) {
            
            if (array[i] != null) {
                for (int count = 0; array[i].charAt(i) != ' ';count  ) {
                    if(count == 0)
                    System.out.println(array[i] " ");
                }
            }
        }
           
    }
  

Основной код для справки:

     import java.util.*;
    import java.util.Scanner;

    public class StringsWithSpaces {

public static void main(String[] args) 
{
    
    Scanner s = new Scanner(System.in);
    String[] array = new String[20];
    System.out.println("Please enter anything..., or type QUIT to quit.");
    
    for (int i = 0; i < array.length; i  ) {
        array[i] = s.nextLine();
        boolean result = Arrays.stream(array).anyMatch("QUIT"::equals);
       if(result) 
       {
           break;
       }
    }
    String str = null;
    int len = -1;
    
    
    System.out.println("Would you like to display strings with No Spaces, One Space or More? Type No, One, More to see the results: ");
    String answer = s.nextLine();
    if(answer.equals("No")){
        
        for (int i = 0; i < array.length;i  ) {
            
            if (array[i] != null) {
                for (int count = 0; array[i].charAt(i) != ' ';count  ) {
                    if(count == 0)
                    System.out.println(array[i] " ");
                }
            }
        }
           
    }
        else if(answer.equals("One"))
        {
            for (int i = 0; i < array.length;i  ) {
                int count = 0;
                if (array[i] != null) {
                    if (array[i].charAt(i) != ' ') {
                        count  ;
                        System.out.println(count);
                    }
                    
                        //System.out.print(array[i]   " ");   
                }
             }
        }
        else
            System.out.println("No values to show");

    System.out.println();
}   
  

}

Я искал что-то подобное, но мог найти только другие языки. Спасибо за всю помощь.

Ответ №1:

В первом наборе вложенных циклов вы в основном проверяете один и тот же символ каждого слова каждый раз. Вы должны использовать count в качестве параметра для метода charAt вместо любого индекса в i; Также вы должны выводить слово только тогда, когда count равен длине слова минус один.

Вот оно:

 if(answer.equals("No")){

        for (int i = 0; i < array.length;i  ) {

            if (array[i] != null) {
                for (int count = 0; array[i].charAt(i) != ' ' ;count  ) {
                    if(count == array[i].length()-1) {
                        System.out.println(array[i]);
                        break;
                    }
                }
            }
        }

    }
  

Я также переписал второй набор вложенных циклов, он должен объясниться:

 else if(answer.equals("One"))
        {
            for (int i = 0; i < array.length;i  ) {
                int count = 0;
                for (int j = 0; j < array[i].length(); j  ) {
                    if (Character.isSpaceChar(array[i].charAt(j)))
                        count  ;
                }
                if (count == 1) {
                    System.out.println(array[i]);
                }

            }
        }
  

РЕДАКТИРОВАТЬ: я забыл упомянуть, что я добавил оператор break, который вы забыли. Это гарантирует, что цикл for завершается, когда вы достигаете последнего символа в строке. Без этого оператора ваше приложение будет аварийно завершать работу каждый раз, когда оно попадает в конец строки из-за исключения IndexOutOfBoundsException .