0

我正在为我的大学的 CS 140 课程做一个项目,我正在尝试创建一个程序,该程序使用选择排序,其中包含美国 50 个州的数组,其中包含名称、人口、首都和地区的字段。这是给定的数组:

private static void loadStates() {
    // Set the search key to be the state name.
    State.setKey("name");

    us = new Country("United States", 311591917, "Washington DC",
            new State[]{
                new State("Alabama", 4802740, "Montgomery", "Southeast"),
                new State("Alaska", 722718, "Juneau", "West"),
                new State("Arizona", 6482505, "Phoenix", "Southwest"),
                new State("Arkansas", 2937979, "Little Rock", "Southeast"),
                new State("California", 37691912, "Sacramento", "West"),
                new State("Colorado", 5116769, "Denver", "West"),
                new State("Connecticut", 3580709, "Hartford", "Northeast"),
                new State("Delaware", 907135, "Dover", "Northeast"),
                new State("Florida", 19057542, "Tallahassee", "Southeast"),
                new State("Georgia", 9815210, "Atlanta", "Southeast"),
                new State("Hawaii", 1374810, "Honolulu", "West"),
                new State("Idaho", 1584985, "Boise", "West"),
                new State("Illinois", 12869257, "Springfield", "Midwest"),
                new State("Indiana", 6516922, "Indianapolis", "Midwest"),
                new State("Iowa", 3062309, "Des Moines", "Midwest"),
                new State("Kansas", 2871238, "Topeka", "Midwest"),
                new State("Kentucky", 4369356, "Frankfurt", "Southeast"),
                new State("Louisiana", 4574836, "Baton Rouge", "Southeast"),
                new State("Maine", 1328188, "Augusta", "Northeast"),
                new State("Maryland", 5828289, "Annapolis", "Northeast"),
                new State("Massachusetts", 6587536, "Boston", "Northeast"),
                new State("Michigan", 9876187, "Lansing", "Midwest"),
                new State("Minnesota", 5344861, "St. Paul", "Midwest"),
                new State("Mississippi", 2978512, "Jackson", "Southeast"),
                new State("Missouri", 6010688, "Jefferson City", "Midwest"),
                new State("Montana", 998199, "Helena", "West"),
                new State("Nebraska", 1842641, "Lincoln", "Midwest"),
                new State("Nevada", 2723322, "Carson City", "West"),
                new State("New Hampshire", 1318194, "Concord", "Northeast"),
                new State("New Jersey", 8821155, "Trenton", "Northeast"),
                new State("New Mexico", 2082224, "Santa Fe", "Southwest"),
                new State("New York", 19465197, "Albany", "Northeast"),
                new State("North Carolina", 9656401, "Raleigh", "Southeast"),
                new State("North Dakota", 683932, "Bismarck", "Midwest"),
                new State("Ohio", 11544951, "Columbus", "Midwest"),
                new State("Oklahoma", 3791508, "Oklahoma City", "Southwest"),
                new State("Oregon", 3871859, "Salem", "West"),
                new State("Pennsylvania", 12742886, "Harrisburg", "Northeast"),
                new State("Rhode Island", 1051302, "Providence", "Northeast"),
                new State("South Carolina", 4679230, "Columbia", "Southeast"),
                new State("South Dakota", 824082, "Pierre", "Midwest"),
                new State("Tennessee", 6403353, "Nashville", "Southeast"),
                new State("Texas", 25674681, "Austin", "Southwest"),
                new State("Utah", 2817222, "Salt Lake City", "West"),
                new State("Vermont", 4802740, "Montpelier", "Northeast"),
                new State("Virginia", 8096604, "Richmond", "Southeast"),
                new State("Washington", 6830038, "Olympia", "West"),
                new State("West Virginia", 1855364, "Charleston", "Southeast"),
                new State("Wisconsin", 5711767, "Madison", "Midwest"),
                new State("Wyoming", 568158, "Cheyenne", "West")
            });
} // end loadStates()

依此类推,适用于每个州。这是我的选择排序。根据教授的要求,它分为三种方法。

private static void selectionSort(State[] states, String onField) {
    for (int top = 0; top < states.length - 1; top++) {
        swap(states, top, indexOfMinValueInArray(states, top, onField));
    }
} // end selectionSort()

private static int indexOfMinValueInArray(State[] states, int startAt,
        String onField) {
    int minIndex = startAt;
    if ("name".equals(onField)) {
        for (int index = startAt; index < states.length; index++) {
            if (states[index].getName().compareTo(states[minIndex].getName()) < 0) {
                minIndex = index;
            }
        }
    } else if ("population".equals(onField)) {
        for (int index = startAt; index < states.length; index++) {
            if (states[index].getPopulation() < states[minIndex].getPopulation()) {
                minIndex = index;
            }
        }
    }
    return minIndex;
}// end indexOfMinValueInArray()

private static void swap(State[] states, int index1, int index2) {
    State temp = states[index1];
    states[index1] = states[index2];
    states[index2] = temp;
}

基本上,这应该做的是获取一个“键”,或者,如方法中所述,“onField”应该告诉选择排序按名称、人口、首都或地区对数组进行排序的内容. 这就是我迷失的地方。有人可以就如何纠正我的选择排序提供一些指导吗?此外,这是代码的开头,因此您可以看到我需要采取的方向。

public static void main(String[] args) {
    loadStates();

    State[] sortedStates = new State[50];
    for (int i = 0; i <= 49; i++) {
        sortedStates[i] = us.getStateAtIndex(i);
    }

    // TODO: Sort the states by population.
    selectionSort(sortedStates, "population");

    // TODO: List the states by population.
    listStates(sortedStates);
4

1 回答 1

2

我建议定义四个Comparator对象,每个字段一个作为键。例如,对于name字段:

public class NameComparator implements Comparator<State> {
    public int compare(State s1, State s2) {
        return s1.name.compareTo(s2.name);
    }
}

其他比较器可以类似定义。然后,您可以定义选择排序以使用 aComparator<State>进行项目比较,并且您可以根据键指定选择要使用的比较器。

于 2012-11-25T03:47:18.687 回答