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()

など、すべての州についてです。これが私の選択ソート用のものです。教授が必要とするものとして、3つの方法に分けられます。

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各フィールドに 1 つずつ、4 つのオブジェクトをキーとして定義することをお勧めします。たとえば、nameフィールドの場合:

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

他のコンパレータも同様に定義できます。次に、 a を使用してアイテムの比較を行うように選択ソートを定義Comparator<State>し、キー指定に基づいて使用するコンパレータを選択できます。

于 2012-11-25T03:47:18.687 に答える