首页
学习
活动
专区
圈层
工具
发布

州花鸟
EN

Code Review用户
提问于 2015-09-29 19:19:57
回答 3查看 2K关注 0票数 3

这是按原样运行的,但我正在寻找另一种方法来编写它。

代码语言:javascript
复制
import java.util.Scanner;

public class StateBirdAndFlowerProgram {

    public static void main(String args[]) {

      // Begin Scanner for user input later on
      Scanner input = new Scanner( System.in );

       //Begin array of information
      String[][] states={
                        {"Alabama", "Flower: Camelia", "Bird: Northern flicker"},
                        {"Alaska", "Flower: Forget-me-not", "Bird: Willow ptarmigan "},
                        {"Arizona", "Flower: Saguaro cactus blossom", "Bird: Cactus wren "},
                        {"Arkansas", "Flower: Apple blossom", "Bird: Northern mockingbird "},
                        {"Califorina", "Flower: Califorina poppy", "Bird: California quail"},
                        {"Colorado", "Flower: Rocky Mountian columbine", "Bird: Lark bunting"},
                        {"Connecticut", "Flower: Mountain laurel ", "Bird: American robin"},
                        {"Delaware", "Flower: Peach blossom", "Bird: Delaware Blue Hen "},
                        {"Florida", "Flower: Orange blossom ", "Bird: Northern mockingbird "},
                        {"Georgia", "Flower: Cherokee rose ", "Bird: Brown thrasher ", },
                        {"Hawaii", "Flower: Hawaiian hibiscus ", "Bird: Nēnē or Hawaiian goose"},
                        {"Idaho", "Flower: Syringa, mock orange ", "Bird: Mountain bluebird  "},
                        {"Illinois", "Flower: Violet ", "Bird: Northern cardinal "},
                        {"Indiana", "Flower: Peony ", "Bird: Northern cardinal "},
                        {"Iowa ", "Flower: Wild prairie rose ", "Bird: Eastern goldfinch "},
                        {"Kansas", "Flower: Sunflower", "Bird: Western meadowlark"},
                        {"Kentucky", "Flower: Goldenrod ", "Bird: Northern cardinal"},
                        {"Louisiana", "Flower: Magnolia ",  "Bird: Brown pelican "},
                        {"Maine", "Flower: White pine cone and tassel ", "Bird: Black-capped chickadee "},
                        {"Maryland", "Flower: Black-eyed susan ", "Bird: Baltimore oriole"},
                        {"Massachusetts", "Flower: Mayflower ", "Bird: Black-capped chickadee "},
                        {"Michigan", "Flower: Apple blossom",  "Bird: American robin "},
                        {"Minnesota", "Flower:Pink and white lady's slipper ","Bird: Common loon"},
                        {"Mississippi", "Flower: Magnolia", "Bird: Northern mockingbird "},
                        {"Missouri", "Flower: Hawthorn", "Bird: Eastern bluebird "},
                        {"Montana", "Flower: Bitterroot ", "Bird: Western meadowlark "},
                        {"Nebraska", "Flower: Goldenrod", "Bird: Western meadowlark"},
                        {"Nevada", "Flower: Sagebrush ", "Bird: Mountain bluebird "},
                        {"New Hampshire ", "Flower: Purple lilac ", "Bird: Purple finch "},
                        {"New Jersey", "Flower: Violet ", "Bird: Eastern goldfinch "},
                        {"New Mexico", "Flower: Yucca flower", "Bird: Roadrunner  "},
                        {"New York", "Flower: Rose", "Bird: Eastern bluebird "},
                        {"North Carolina", "Flower: Flowering dogwood", "Bird: Northern cardinal "},
                        {"North Dakota", "Flower: Wild prairie rose ", "Bird: Western meadowlark "},
                        {"Ohio", "Flower: carlet carnation ", "Bird Northern cardinal: "},
                        {"Oklahoma", "Flower: Oklahoma rose ",  "Bird: Scissor-tailed flycatcher "},
                        {"Oregon", "Flower: Oregon grape ", "Bird: Western meadowlark "},
                        {"Pennsylvania", "Flower: Mountain laurel", "Bird: Ruffed grouse"},
                        {"Rhode Island", "Flower: Violet", "Bird: Rhode Island Red "},
                        {"South Carolina", "Flower: Yellow jessamine ","Bird: Carolina wren", },
                        {"South Dakota ", "Flower: Pasque flower ", "Bird: Ring-necked pheasant"},
                        {"Tennessee", "Flower: Iris", "Bird: Northern mockingbird ",},
                        {"Texas", "Flower: Bluebonnet sp. ", "Bird: Northern mockingbird "},
                        {"Utah", "Flower: Sego lily", "Bird: California gull "},
                        {"Vermont", "Flower: Red clover ", "Bird: Hermit thrush"},
                        {"Virginia", "Flower: American dogwood", "Bird: Northern cardinal"},
                        {"Washington", "Flower: Coast rhododendron", "Bird: Willow goldfinch "},
                        {"West Virginia", "Flower:Rhododendron", "Bird: Northern cardinal "},
                        {"Wisconsin", "Flower: Wood violet ", "Bird: American robin "},
                        {"Wyoming", "Flower: Indian paintbrush ", "Bird: Western meadowlark "}};
      // While loop to search through array
      while(true) {

           // Request user input
           System.out.println("Enter a state: ");
           // Capture user input
           String stateName =input.nextLine();
           // exit statement
           if(stateName.equalsIgnoreCase("None"))
                // Exit program
                System.exit(0);

           else {
                // For loop to search through array
                for(int row=0,column=0;row<states.length;row++) {
                     // If statement for matching input string to array data
                     if(states[row][0].equalsIgnoreCase(stateName)) {
                          // Print bird information
                          System.out.println("Bird: " + states[row][column+1]);
                          // Print Flower information
                          System.out.println("Flower: " + states[row][column+2] + "\n");

                     } // end if

                } // end for

           } // end else

      } // end while

 } // end main
} // end class
EN

回答 3

Code Review用户

发布于 2015-09-29 20:03:34

Bug

我运行了您的代码,得到了如下输出:

进入一个州:印第安纳鸟:花:牡丹花:鸟:北红衣主教

所以,有两件事:

(一)您的列的顺序不对或标签不正确;

2)你的标签是复制的。它们已经存在于您的数据中(这是不寻常的),因此您可以从print子句中删除标签。

代码语言:javascript
复制
                      System.out.println(states[row][column+1]);
                      System.out.println(states[row][column+2] + "\n");

然而,在更现实的情况下,标签很可能不会与数据一起包括在内。

更好的UI

您的用户输入不是很直观。接受这一系列的输入:

进入一个州:波士顿进入一个州;加拿大进入一个州:42个进入一个州:无

如果在数组中找不到输入的值,那么更改代码以添加到达的System.out.println("State not found: " + stateName)应该是非常容易的。

此外,考虑添加此System.out.println("Enter a state: (or None to exit)");作为退出程序的方式并不明显。

代码注释

我不确定是否对每一行代码进行注释是老师的要求,但大多数程序员会发现这是非常过分的。在生产代码中,您不经常看到代码注释(除了特定于语言的构造(如JavaDoc) ),因为代码应该为自己说明它所做的事情。如果某个代码背后的推理不清楚,通常只需要添加注释。

这些措施特别过分:

} // end if } // end for } // end else } // end while } // end main } // end class

实际上,在许多情况下,在需要变量之前,最好不要声明变量。如果您必须始终上下查找以查找变量声明的使用情况,那么代码就更难理解了。它还使将变量保持在正确的范围更容易。

//开始扫描,以便稍后在Scanner = new Scanner( System.in )上输入用户;

我相信其他人会找到很多其他的东西来批评和帮助您编写代码,这只是一个开始。

票数 8
EN

Code Review用户

发布于 2015-09-30 03:31:46

使用Enum

您的数据集肯定是我会使用枚举的东西,如果不是csv的话。

下面是一个简洁的例子,说明这是什么样子的:

代码语言:javascript
复制
enum States {
    AL("Alabama", "Camelia", "Northern Flicker"),
    NY("New York", "Rose", "Eastern Bluebird");

    private final String name;
    private final String flower;
    private final String bird;

    States(String name, String flower, String bird) {
        this.name = name;
        this.flower = flower;
        this.bird = bird;
    }

    @Override
    public String toString() {
        return name;
    }

    public String initials() {
        return name();
    }

    public String flower() {
        return flower;
    }

    public String bird() {
        return bird;
    }
}

下面是一个使用上述方法的示例:

代码语言:javascript
复制
import java.util.Scanner;

public class Tester {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.println("Enter a state's name or initials to look for:");
        String userSelection = input.nextLine();

        // search through the enum
        for (States state : States.values()) {
            if (userSelection.equalsIgnoreCase(state.toString())
            || userSelection.equalsIgnoreCase(state.initials())) {
                System.out.println(
                    state.toString() + "'s bird is the " + state.bird()
                    + " and their flower is: " + state.flower()
                );
                break;
            }
        }

        /* You can extract the above into a method that returns true or false
           and  if false tells the user their entry was invalid/doesn't exist */
    }
}
票数 6
EN

Code Review用户

发布于 2015-09-29 20:13:27

当我看到这样的东西时,想到了两件事。不过,两者都归结为封装。第一个想法是创建一个State类,其中有一个花,并在它上有一个鸟巢属性。然后,你可以简单地列出这些国家的名单,并适当地进行过滤。

代码语言:javascript
复制
static List<U_S_State> usStates;
static {
    usStates = new ArrayList<U_S_State>();
    usStates.add(new U_S_State("Alabama", "Flower: Camelia", "Bird: Northern flicker"));
}
//pre java 8, comparable needed on U_S_State
public void GetInfo1(String stateName){
    int index = usStates.indexOf(new U_S_State(stateName));
    if (index == -1){//not found
        return;
    }

    U_S_State state = usStates.get(index);
    System.out.println("Bird: " + state.getStateBird());
    System.out.println("Flower: " + state.getStateFlower() + "\n");
}
//Using java8 stream comparable not needed on U_S_State
public void GetInfo2(String stateName){
    if(!usStates.stream().anyMatch(s->s.getStateName()==stateName))
        return;

    U_S_State state = usStates.stream()
            .filter(s->s.getStateName() == stateName)
            .findFirst().get();

    System.out.println("Bird: " + state.getStateBird());
    System.out.println("Flower: " + state.getStateFlower() + "\n");
}

public class U_S_State implements Comparable<U_S_State>{
    private final String stateFlower;
    private final String stateBird;
    private final String stateName;
    private String stateAbbreviation;

    public U_S_State(String stateName){
        this(stateName, "", "");
    }
    public U_S_State(String stateName, String stateFlower, String stateBird) {
        this.stateFlower = stateFlower;
        this.stateBird = stateBird;
        this.stateName = stateName;
    }

    public String getStateAbbreviation() {
        return stateAbbreviation;
    }

    public void setStateAbbreviation(String stateAbbreviation) {
        this.stateAbbreviation = stateAbbreviation;
    }

    public String getStateName() {
        return stateName;
    }

    public String getStateBird() {
        return stateBird;
    }

    public String getStateFlower() {
        return stateFlower;
    }

    @Override
    public int compareTo(U_S_State o) {
        return o.stateName.compareTo(this.stateName);
    }
}

请注意,在名字(甚至命名约定)方面,这可能不是最好的选择,但这确实给了您和去哪里的想法。创建一个可以将自己与他人相比的类。我们只对比较各州的名字感兴趣。实现Comparable<T>对于list是很重要的,因为它是您将如何搜索一个项目前java 8。使用java 8,您可以使用流和lambda的。如果你理解他们方便。这是我的建议。

票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/106052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档