使用多参数构造函数进行选择排序

时间:2012-11-25 03:41:32

标签: java

我正在为我的大学的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);

1 个答案:

答案 0 :(得分:2)

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

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

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