2013-10-09 22 views
2

例如,我有一個名爲RecordGroup的java對象。類簽名低於給: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; 
} 

}

而且,我有如下給予持有上述對象的名單列表。

公共類測試{

列表< 'RecordGroup'> mergerMap =新的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)); 

}

我的問題是,如何通過他們的「老闆」和「STARTROW」上述RecordGroup對象的列表進行排序,以便它可以組由業主記錄,即第一個「區」組那麼「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)); 
+0

[地產自定義對象的排序的ArrayList]的可能重複(HTTP:/ /stackoverflow.com/questions/2784514/sort-arraylist-of-custom-objects-by-property) – sanbhat

+0

這將解決你的目的。 http://www.thejavageek.com/2013/06/17/sorting-user-defined-objects-part-2/ –

回答

0

你必須寫你自己的比較,以便它要與您的具體和專門收集的對象是什麼..

嘗試給這裏看看Interface Comparator

編輯: 可能媲美甚至更好,因爲對方的回答表明

0

簡單實現Java的接口Comparable,根據需要覆蓋compareTo函數,並將RecordGroups推送到SortedSet,如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

更新:如果您需要爲不同位置的不同分類法,中,實體結合的比較功能OFC。不是你想要實現的。 (通過整個系統將是平等的)。如果是這種情況,只需在每個分類案例中使用一個Comperator。

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 
    } 
} 
+1

compareTo以小寫字母開頭 –

+0

您是對的!我編輯了答案。感謝您的更正。 –

0

比較爲您完成此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 
] 
相關問題