3

たとえば、RecordGroup という Java オブジェクトがあります。クラスの署名は以下のとおりです。

パブリック クラス RecordGroup {

private String owner;
private Integer startRow;
private Integer recordCount;

public RecordGroup() {
}

public RecordGroup(String owner, Integer startRow, Integer recordCount) {
    this.owner = owner;
    this.startRow = startRow;
    this.recordCount = recordCount;
}

public String getOwner() {
    return owner;
}

public void setOwner(String owner) {
    this.owner = owner;
}

public Integer getRecordCount() {
    return recordCount;
}

public void setRecordCount(Integer recordCount) {
    this.recordCount = recordCount;
}

public Integer getStartRow() {
    return startRow;
}

public void setStartRow(Integer startRow) {
    this.startRow = startRow;
}

}

そして、以下に示すように、上記のオブジェクトのリストを保持するリストがあります。

パブリック クラス テスト {

List<'RecordGroup'> mergerMap = new ArrayList<'RecordGroup'>();

    mergerMap.add(new RecordGroup("RECORD", 1, 6));
    mergerMap.add(new RecordGroup("RECORD", 7, 9));
    mergerMap.add(new RecordGroup("RECORD", 3, 4));
    mergerMap.add(new RecordGroup("ZONE", 3, 1));
    mergerMap.add(new RecordGroup("MODULE", 5, 6));
    mergerMap.add(new RecordGroup("ZONE", 14, 28));
    mergerMap.add(new RecordGroup("ZONE", 6, 30));
    mergerMap.add(new RecordGroup("MODULE", 1, 60));
    mergerMap.add(new RecordGroup("OFFICE", 2, 4));
    mergerMap.add(new RecordGroup("OFFICE", 8, 6));
    mergerMap.add(new RecordGroup("USER", 1, 6));
    mergerMap.add(new RecordGroup("USER", 9, 8));
    mergerMap.add(new RecordGroup("USER", 5, 7));
    mergerMap.add(new RecordGroup("OFFICE", 3, 1));

}

私の質問は、上記の RecordGroup オブジェクトのリストを「所有者」と「startRow」でソートして、レコードを所有者でグループ化できるようにする方法です。つまり、最初に「ZONE」グループ、次に「OFFICE」グループ、次に「USER」グループと次に「MODULE」、最後に「RECORD」グループがリストに表示されます。また、ソートおよびグループ化の際に「startRow」フィールドを考慮する必要があります。つまり、各グループを「startRow」フィールドの値で昇順に並べ替えます。

出力は次のようになります。

mergerMap.add(new RecordGroup("ZONE", 3, 1));
mergerMap.add(new RecordGroup("ZONE", 6, 30));
mergerMap.add(new RecordGroup("ZONE", 14, 28));
mergerMap.add(new RecordGroup("OFFICE", 2, 4));
mergerMap.add(new RecordGroup("OFFICE", 3, 1));
mergerMap.add(new RecordGroup("OFFICE", 8, 6));
mergerMap.add(new RecordGroup("USER", 1, 6));
mergerMap.add(new RecordGroup("USER", 5, 7));
mergerMap.add(new RecordGroup("USER", 9, 8));
mergerMap.add(new RecordGroup("MODULE", 1, 60));
mergerMap.add(new RecordGroup("OFFICE", 2, 4));
mergerMap.add(new RecordGroup("MODULE", 5, 6));
mergerMap.add(new RecordGroup("RECORD", 1, 6));
mergerMap.add(new RecordGroup("RECORD", 3, 4));
mergerMap.add(new RecordGroup("RECORD", 7, 9));
4

4 に答える 4

0

おそらくjava.lang.Comparableインターフェースを実装する必要があります。

public class RecordGroup implements Comparable<RecordGroup> {
  //Rest of your implementation
  @Override
  public int compareTo(RecordGroup o) {
     //logic to compare two RecordGroup objects
  }
}
于 2013-10-09T09:26:38.397 に答える
0

特定の特殊なコレクションのオブジェクトで必要なことを実行できるように、独自のコンパレーターを作成する必要があります。

ここを見てみてくださいインターフェイスコンパレータ

編集:他の回答が示唆するように、おそらく同等の方がさらに優れています

于 2013-10-09T09:18:55.533 に答える
0

Comparator はこれを行いますComparator

次のコードを使用します。

public int compare(RecordGroup o1, RecordGroup o2) {
if (o1.getOwner().compareTo(o2.getOwner()) == 0) {
return o1.getStartRow() - o2.getStartRow();
} else {
return o1.getOwner().compareTo(o2.getOwner());
}
}
});

動作するデモを確認するには、http://ideone.com/rsM9Unにアクセスしてデモを確認してください ここで startRow は昇順です

出力:

[MODULE , 1
, MODULE , 5
, OFFICE , 2
, OFFICE , 3
, OFFICE , 8
, RECORD , 1
, RECORD , 3
, RECORD , 7
, USER , 1
, USER , 5
, USER , 9
, ZONE , 3
, ZONE , 6
, ZONE , 14
]
于 2013-10-09T09:29:18.360 に答える
0

ComparableJava のインターフェイスを簡単に実装し、compareTo必要に応じて関数をオーバーライドして、RecordGroups を SortedSet や sth などにプッシュしますTreeSet

http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html

http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html

更新:場所ごとに異なる並べ替えが必要な場合は、エンティティにバインドされた比較関数が機能します。実装したいものではありません。(システム全体で等しくなります)。このような場合は、並べ替えのケースごとに Comperator を使用してください。

于 2013-10-09T09:19:37.190 に答える