0

多くの人がこの問題に遭遇したと思います。文字列コンポーネントと整数で構成される 2D 配列があります。元。

    `String[][] data = {{"Name1","5"}, {"Name2","10"},{"Name3","1"}, {"Name4","3"}};`

ここで、その 2D 配列を整数 (この場合はプレーヤーのスコア) で並べ替えたいと考えていますが、一致する名前をプレーヤーのスコアとともに移動させたいと考えています。これは私が得たものですが、結果は想定とはかけ離れています。

    private void sort(){
    boolean sort;
    int current, next;
    do{
            sort = true;
            for (int i = 0; i < data.length - 1; i++){
                if (data[i][1] !=null && data[i+1][1] != null){
                    current = Integer.parseInt(data[i][1]);
                    next = Integer.parseInt(data[i+1][1]);
                        if(current > next){
                                String temp = "";
                                data[i][1] = Integer.toString(next); 
                                data[i+1][1] = Integer.toString(current);
                                data[i][0] = temp;
                                data[i][0] = data[i+1][1];
                                data[i+1][0] = temp;       
                                sort = false;
                        }
                }

            }

    }while(!sort);
}

一般的な 2D 配列を使用する理由を尋ねると、JFRAME では JTable がデータ用に 2D 配列を必要とするためです。

4

2 に答える 2

4

{"Name1","5"}たとえば、比較できる特別な Comparator を作成でき ますが{"Name2","10"} 、データ構造を変更することをお勧めします。

名前intをcaonatinする型を作成します

class NameNum{
   String name;
   int number;
}

それらを1D配列に保存します

NameNum[] data 

比較メソッドを実装し、単にArrays.sort(..)配列をソートするために使用します。

于 2013-01-03T01:10:57.167 に答える
0

まず第一に、配列要素は文字列と整数で構成されていません。

{ "Name1", "5" }

"5"ではなくIntegerStringです。

平等を気にしない場合、ここでの解決策は、このタプル上にラッパーオブジェクトを作成し、Comparableそれ自体を実装して、を使用することSortedSetです。表示するには逆にする必要がありますが、幸いなことに、JDKにはそのためのメソッドが組み込まれています。

サンプルコード:

private static final String[][] data = {
    { "Name1", "5" },
    { "Name2", "10" },
    { "Name3", "1" },
    { "Name4", "3" }
};

private static final class Score
    implements Comparable<Score>
{
    private final String name;
    private final int score;

    private Score(final String name, final String scoreAsString)
    {
        this.name = name;
        // NOTE: this can throw an (unchecked) NumberFormatException,
        // but this code assumes that it never does
        score = Integer.parseInt(scoreAsString);
    }

    @Override
    public int compareTo(final Score o)
    {
        final int ret = score - o.score;
        return ret != 0 ? ret : name.compareTo(o.name);
    }

    // Print results nicely ;)
    @Override
    public String toString()
    {
        return "Name: " + name + ", score: " + score;
    }
}

public static void main(final String... args)
{
    final SortedSet<Score> set = new TreeSet<Score>();
    Score score;

    for (final String[] raw: data) {
        score = new Score(raw[0], raw[1]);
        set.add(score);
    }

    // Build a List from that Set...
    final List<Score> scoreList = new ArrayList<Score>(set);

    // Reverse it...
    Collections.reverse(scoreList);

    // Print results
    for (final Score s: scoreList)
        System.out.println(s);
}

上記のコードをコピーしてクラスに貼り付け、実行します。意図したとおりに実行されることがわかります。

重要な注意:はい、このカスタムクラスは/をオーバーライドしませ。これは見落としではありません。ここでは比較のみが必要であるため(aが使用されているため)、それらを実装する理由はまったくありませんでした。equals()hashCode()SortedSet

于 2013-01-03T01:55:49.297 に答える