Повторение программы до тех пор, пока пользователь не введет none с помощью массивов

#java #arrays #loops

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

Вопрос:

Я пытаюсь многократно запускать свой код, пока пользователь не введет none. И когда я ввожу имя состояния, мне нужно, чтобы оно один раз отображало состояние flower и состояние bird без какого-либо сообщения об ошибке (попробуйте еще раз). Но поскольку я написал строку for(int i=0; i<stateInfo.length; i ) , она повторяет «попробуйте еще раз» 49 раз и дает мне ответ в n-й строке, где состояние находится в массивах. Мне нужно заставить его работать, печатая только состояние flower и state bird.

 //import Scanner, time.Duration, time.Instant
import java.util.Scanner;
import java.time.Duration;
import java.time.Instant;

public class StateFlowerBird {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

    //Time counts starts
    Instant start = Instant.now();
    //greeting user
    greetings();

    //construct Scanner
    Scanner scannerIn = new Scanner(System.in);
    String state = "";

do {
    //2D Arrays with State, state flower, and state bird
    String[][] stateInfo = new String[][]{
    {"Alabama", "Camellia", "Yellowhammer"},
    {"Alaska", "Forget-me-not", "Willow Ptarmigan"},
    {"Arizona", "Saguaro cactus", "Cactus Wren"},
    {"Arkansas", "Apple blossom", "Mockingbird"},
    {"California", "Golden poppy", "California Valley Quail"},
    {"Colorado", "Rocky Mountain Columbine", "Lark Bunting"},
    {"Connecticut", "Mountain laurel", "Robin"},
    {"Delaware", "Peach blossom", "Blue Hen Chicken"},
    {"Florida", "Orange blossom", "Mockingbird"},
    {"Georgia", "Cherokee rose", "Brown Thrasher"},
    {"Hawaii", "Hibiscus", "Nene"},
    {"Idaho", "Syringa", "Mountain Bluebird"},
    {"Illinois", "Native violet", "Cardinal"},
    {"Indiana", "Peony", "Cardinal"},
    {"Iowa", "Wild rose", "Eastern Goldfinch"},
    {"Kansas", "Native sunflower", "Western Meadowlark"},
    {"Kentucky", "Goldenrod", "Cardinal"},
    {"Louisiana", "Magnolia", "Eastern Brown"},
    {"Maine", "Pine cone amp; tassle", "Chickadee"},
    {"Maryland", "Black Eyed Susan", "Baltimore Oriole"},
    {"Massachusettes", "Mayflower", "Chickadee"},
    {"Michigan", "Apple blossom", "Robin"},
    {"Minnesota", "Lady slipper", "Common Loon"},
    {"Mississippi", "Magnolia", "Mockingbird"},
    {"Missouri", "Hawthorn", "Bluebird"},
    {"Montana", "Bitterroot", "Western Meadowlark"},
    {"Nebraska", "Goldenrod", "Western Meadowlark"},
    {"Nevada", "Sagebrush", "Mountain Bluebird"},
    {"New Hampshire", "Purple lilac", "Purple Finch"},
    {"New Jersey", "Purple violet", "Eastern Goldfinch"},
    {"New Mexico", "yucca", "Roadrunner"},
    {"New York", "Rose", "Bluebird"},
    {"North Carolina", "Dogwood", "Cardinal"},
    {"North Dakota", "Wild prairie rose", "Western Meadowlark"},
    {"Ohio", "Scarlet carnation", "Cardinal"},
    {"Oklahoma", "Mistletoe", "Scissor-tailed"},
    {"Oregon", "Oregon Grape", "Western Meadowlark"},
    {"Pennsylvania", "Mountain laurel", "Ruffed Grouse"},
    {"Rhode Island", "Violet", "Rhode Island Red"},
    {"South Carolina", "Yellow jessamine", "Great Carolina Wren"},
    {"South Dakota", "Pasque flower", "Ring-necked Pheasant"},
    {"Tennesssee", "Purple iris", "Mockingbird"},
    {"Texas", "Texas Blue Bonnet", "Mockingbird"},
    {"Utah", "Sego lily", "American Seagull"},
    {"Vermont", "Red clover", "Hermit Thrush"},
    {"Virginia", "Dogwood", "Cardinal"},
    {"Washington", "Western rhododendron", "Willow Goldfinch"},
    {"West Virginia", "Rhododendron", "Cardinal"},
    {"Wisconsin", "Wood violet", "Robin"},
    {"Wyoming", "Indian paint brush", "Western Meadowlark"}}; 

    state = "";
    //Ask user to type the name of state or none
    System.out.println("nEnter a State or None to exit: "   state);
    state = scannerIn.nextLine();

    for(int stateNum = 0;stateNum<stateInfo.length;stateNum  ){
        if(stateInfo[stateNum][0].equalsIgnoreCase(state)){
            System.out.println("Flower: "  stateInfo[stateNum][1]
                      "nBird: "   stateInfo[stateNum][2]);
        }
        else if(!stateInfo[stateNum][0].equalsIgnoreCase(state)){
            errorMessage();
        }
    }

} while(!state.equalsIgnoreCase("None"));
    if (state.equalsIgnoreCase("None")){
        endStatement();
    }
    Instant end = Instant.now();
        System.out.println("Elapsed time in seconds was: " 
              Duration.between(start, end).toNanos()/1_000_000_000.0 
              " seconds.");
    System.out.println("**********************************");
    System.exit(0);
}


private static void greetings() {
        System.out.println("*****************************************************");
    System.out.println("***** Let's find out the state flower and bird! *****");
}
private static void endStatement() {
    System.out.println("n***** Thank you for playing! *****");
}

private static void errorMessage() {
    System.out.println("Invalid State. Try it again.");
}
}
  

Ответ №1:

Используйте ‘break’ в условии if . Как только будет найдено совпадение, цикл прервется.

Ответ №2:

 /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

//import Scanner, time.Duration, time.Instant
import java.util.Scanner;
import java.time.Duration;
import java.time.Instant;

public class StateFlowerBird {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        //Time counts starts
        Instant start = Instant.now();
        //greeting user
        greetings();

        //construct Scanner
        Scanner scannerIn = new Scanner(System.in);
        String state = "";

        do {
            //2D Arrays with State, state flower, and state bird
            String[][] stateInfo = new String[][]{
                {"Alabama", "Camellia", "Yellowhammer"},
                {"Alaska", "Forget-me-not", "Willow Ptarmigan"},
                {"Arizona", "Saguaro cactus", "Cactus Wren"},
                {"Arkansas", "Apple blossom", "Mockingbird"},
                {"California", "Golden poppy", "California Valley Quail"},
                {"Colorado", "Rocky Mountain Columbine", "Lark Bunting"},
                {"Connecticut", "Mountain laurel", "Robin"},
                {"Delaware", "Peach blossom", "Blue Hen Chicken"},
                {"Florida", "Orange blossom", "Mockingbird"},
                {"Georgia", "Cherokee rose", "Brown Thrasher"},
                {"Hawaii", "Hibiscus", "Nene"},
                {"Idaho", "Syringa", "Mountain Bluebird"},
                {"Illinois", "Native violet", "Cardinal"},
                {"Indiana", "Peony", "Cardinal"},
                {"Iowa", "Wild rose", "Eastern Goldfinch"},
                {"Kansas", "Native sunflower", "Western Meadowlark"},
                {"Kentucky", "Goldenrod", "Cardinal"},
                {"Louisiana", "Magnolia", "Eastern Brown"},
                {"Maine", "Pine cone amp; tassle", "Chickadee"},
                {"Maryland", "Black Eyed Susan", "Baltimore Oriole"},
                {"Massachusettes", "Mayflower", "Chickadee"},
                {"Michigan", "Apple blossom", "Robin"},
                {"Minnesota", "Lady slipper", "Common Loon"},
                {"Mississippi", "Magnolia", "Mockingbird"},
                {"Missouri", "Hawthorn", "Bluebird"},
                {"Montana", "Bitterroot", "Western Meadowlark"},
                {"Nebraska", "Goldenrod", "Western Meadowlark"},
                {"Nevada", "Sagebrush", "Mountain Bluebird"},
                {"New Hampshire", "Purple lilac", "Purple Finch"},
                {"New Jersey", "Purple violet", "Eastern Goldfinch"},
                {"New Mexico", "yucca", "Roadrunner"},
                {"New York", "Rose", "Bluebird"},
                {"North Carolina", "Dogwood", "Cardinal"},
                {"North Dakota", "Wild prairie rose", "Western Meadowlark"},
                {"Ohio", "Scarlet carnation", "Cardinal"},
                {"Oklahoma", "Mistletoe", "Scissor-tailed"},
                {"Oregon", "Oregon Grape", "Western Meadowlark"},
                {"Pennsylvania", "Mountain laurel", "Ruffed Grouse"},
                {"Rhode Island", "Violet", "Rhode Island Red"},
                {"South Carolina", "Yellow jessamine", "Great Carolina Wren"},
                {"South Dakota", "Pasque flower", "Ring-necked Pheasant"},
                {"Tennesssee", "Purple iris", "Mockingbird"},
                {"Texas", "Texas Blue Bonnet", "Mockingbird"},
                {"Utah", "Sego lily", "American Seagull"},
                {"Vermont", "Red clover", "Hermit Thrush"},
                {"Virginia", "Dogwood", "Cardinal"},
                {"Washington", "Western rhododendron", "Willow Goldfinch"},
                {"West Virginia", "Rhododendron", "Cardinal"},
                {"Wisconsin", "Wood violet", "Robin"},
                {"Wyoming", "Indian paint brush", "Western Meadowlark"}};

            state = "";
            //Ask user to type the name of state or none
            System.out.println("nEnter a State or None to exit: "   state);
            state = scannerIn.nextLine();
            boolean flag = false;
            int index=0;
            for (int stateNum = 0; stateNum < stateInfo.length; stateNum  ) {
                if (stateInfo[stateNum][0].equalsIgnoreCase(state)) {
                   index=stateNum; 
                   flag=true;
                } else if (!stateInfo[stateNum][0].equalsIgnoreCase(state)) {

                }
            }
            if (flag) {
                System.out.println("Flower: "   stateInfo[index][1]
                          "nBird: "   stateInfo[index][2]);
            } else{
                errorMessage();
            }
        } while (!state.equalsIgnoreCase("None"));
        if (state.equalsIgnoreCase("None")) {
            endStatement();
        }
        Instant end = Instant.now();
        System.out.println("**********************************");
        System.exit(0);
    }

    private static void greetings() {
        System.out.println("*****************************************************");
        System.out.println("***** Let's find out the state flower and bird! *****");
    }

    private static void endStatement() {
        System.out.println("n***** Thank you for playing! *****");
    }

    private static void errorMessage() {
        System.out.println("Invalid State. Try it again.");
    }
}
  

Я только что изменил ваш цикл, пожалуйста, посмотрите на эти изменения:

 boolean flag = false;
            int index=0;
            for (int stateNum = 0; stateNum < stateInfo.length; stateNum  ) {
                if (stateInfo[stateNum][0].equalsIgnoreCase(state)) {
                   index=stateNum; 
                   flag=true;
                } else if (!stateInfo[stateNum][0].equalsIgnoreCase(state)) {

                }
            }
            if (flag) {
                System.out.println("Flower: "   stateInfo[index][1]
                          "nBird: "   stateInfo[index][2]);
            } else{
                errorMessage();
            }
  

Ответ №3:

Просто объявите логическое значение boolean stateFound=false; , прежде чем вводить цикл for для проверки состояний. Установите это значение true , когда условие в вашем цикле for имеет значение true (= состояние найдено). Удалите else часть (с сообщением об ошибке) и поместите if(!stateFound) {errorMessage();} после вашего цикла.

Кстати: почему вы объявляете свой массив в каждом цикле do while цикла?

Ответ №4:

 for(int stateNum = 0;stateNum<stateInfo.length;stateNum  ){
        if(stateInfo[stateNum][0].equalsIgnoreCase(state)){
            System.out.println("Flower: "  stateInfo[stateNum][1]
                      "nBird: "   stateInfo[stateNum][2]);
        }
        else if(!stateInfo[stateNum][0].equalsIgnoreCase(state)){
            errorMessage();//It Will execute for every non -matching items
        }
    }
  

используйте break инструкции next to conditions

Ссылка на документацию: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html

             if(stateInfo[stateNum][0].equalsIgnoreCase(state)){
                System.out.println("Flower: "  stateInfo[stateNum][1]
                          "nBird: "   stateInfo[stateNum][2]);
                break;
            }
            else if(!stateInfo[stateNum][0].equalsIgnoreCase(state)){
                errorMessage();
                break;
            }
  

Во-вторых, вы можете использовать boolean для проверки результата
отображения сообщения на основе флага.