Java:如何按照对象的属性对列表进行排序和分组

3
例如,我有一个名为RecordGroup的Java对象。类签名如下: public class 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;
}

}

同时,我有一个列表,它保存了如下所示的对象列表。

public class Test {

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

我的问题是,如何按照它们的“owner”和“startRow”对上述RecordGroup对象列表进行排序,以便可以通过所有者分组记录,即首先显示“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));

可能是按属性对自定义对象的ArrayList进行排序的重复问题。 - sanbhat
这将解决您的问题。http://www.thejavageek.com/2013/06/17/sorting-user-defined-objects-part-2/ - Prasad Kharkar
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
  }
}

1
compareTo 以小写字母开头 - RokL
你是对的!我编辑了答案。感谢纠正。 - Panagiotis Koutsourakis

0

比较器可以帮你做到这一点 比较器

使用以下代码。

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
]

0

你需要编写自己的比较器(comparator),以便它可以根据你特定和专门集合中对象的要求执行操作。

可以在这里参考一下 Comparator接口

编辑: 正如其他答案所建议的那样,可能Comparable(可比较的)更好用。


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

更新:如果您需要不同位置的不同排序,绑定实体比较函数显然不是您想要实现的内容。(它将在整个系统中保持相等)。如果是这种情况,请针对每个排序案例使用一个比较器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接