0

まず、ここに投稿する前に宿題を検索しました。私の要件は、そこに投稿された質問とは少し異なるようです。

ArrayList<ArrayList<Integer>>次の形式のようなマトリックスがあります

| id1 | id2 | score |
|-----|-----|-------|
| 1   | 3   | 95%   |
| 1   | 2   | 100%  |
| 1   | 4   | 85%   |
| 1   | 5   | 95%   |
| 2   | 10  | 80%   |
| 2   | 15  | 99%   |

行列を列ごとに並べ替えたい (最初にスコアを使用し、次に id1 を使用)。私はすでにソートされた方法でid1を持っています。つまり、最初にスコアを使用して同じ id1 を持つすべてのレコードを並べ替え、次に id2 で並べ替える必要もあります。これを行う理由は、各 id1 で id2 のランキングを作成するためです。上記の例の結果は次のようになります。

| q_id | d_id | rank | score |
|------|------|------|-------|
| 1    | 2    | 1    | 100%  |
| 1    | 3    | 2    | 95%   |
| 1    | 5    | 3    | 95%   |
| 1    | 4    | 4    | 85%   |
| 2    | 15   | 1    | 99%   |
| 2    | 10   | 2    | 80%   |

コレクションの組み込みメソッドを使用してJavaでこれを達成するにはどうすればよいですか?

4

4 に答える 4

1

各 ArrayList 行のすべての列/フィールドを含むオブジェクトを作成します。次に Comparator インターフェースを利用し、Collections.sort() を使用します。

http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort%28java.util.List,%20java.util.Comparator%29を確認できます。

于 2012-09-17T21:24:18.680 に答える
1

適切な OO ソリューションは、これを次のように宣言することです。

class Bucket {
    int val1;
    int val2;
    int percent;
}

List<Bucket> myList = ...

Comparator要素を好きなように並べるを提供します

于 2012-09-17T21:26:44.953 に答える
1

あなたが説明していることが実際にマトリックスであるかどうかはわかりません。トリプレットの配列のように見えます。

マトリックスの「行」ごとにラッパー クラスを作成することを検討してください。

class Triplet implements Comparable<Triplet> {
    private int id1;
    private int id2;
    private int score;

    // getters / setters here

    @Override
    int compareTo(Triplet that) {
        // if I understood correctly, you want to sort by score, then id1, then id2.
        int result = this.score - that.getScore();
        if (result == 0) {
            result = this.id1 - that.getId1();
            if (result == 0) {
                result = this.id2 - that.getId2();
            }
        }

        return result;
    }
}

次に、「マトリックス」を次のように表し、ArrayList<Triplet>通常どおりに並べ替えます。

于 2012-09-17T21:35:33.990 に答える
0

まず、整数のリストのリストではなく、Plain Old Java Object (POJO) にデータを保持することをお勧めします。

あなたの例から、データには 2 つの ID とスコアの 3 つの要素があるように見えます。POJO は次のようになります。

public class Record() {
    private int id1;
    private int id2;
    private double score; // percent, so double from 0.0 to 1.0

    public Record(int id1, int id2, double score) {
        this.id1=id1;
        this.id2=id2;
        this.score=score;
    }
    // getters and setters
}

次に、複雑なサブリストの代わりに、List<Record>.

あなたの質問について私が理解していることから、最初にid1で並べ​​替え、次にid2で並べ替えたいと考えています。そうですか?これは基数ソートを要求しているようです(リンクはウィキペディアへ)。

疑似コードは次のようになります。

  1. 各レコードをループし、id1. 各「バケット」は にすることができ、同じ id1 を持つList<Record>すべてのRecordオブジェクトを順不同で含める必要があります。
  2. 各バケットをループして、 で並べ替えますid2
  3. 順序を維持しながら、すべてのバケットをグループに戻します。

これを効率的かつクリーンに実装するには、 やのRecordようなメソッドでオブジェクトを更新する必要があります。public int compareId1(Record other)public int compareId2(Record other)

于 2012-09-17T21:28:46.923 に答える