简体   繁体   English

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

[英]Java: how to sort and group a list of objects by their attributes

For Example I have a java object called RecordGroup. 例如,我有一个名为RecordGroup的java对象。 class signature is give below: 类签名如下:

public class RecordGroup { 公共类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;
}

} }

And, i have a List which holds a list of above object as given below. 并且,我有一个List,其中包含上面提到的上述对象的列表。

public class Test { 公共课测试{

List<'RecordGroup'> mergerMap = new ArrayList<'RecordGroup'>(); 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));

} }

My Question is, how to sort the above List of RecordGroup objects by their 'owner' and 'startRow' so that it can group the records by owner ie first "ZONE" group and then "OFFICE" group and then "USER" group and then "MODULE" and finally "RECORD" group should appear in the list. 我的问题是,如何按照'owner'和'startRow'对RecordGroup对象的上述列表进行排序,以便它可以按所有者分组记录,即首先是“ZONE”组,然后是“OFFICE”组,然后是“USER”组和然后“MODULE”和最后“RECORD”组应出现在列表中。 It should also consider the "startRow" field while sorting and grouping ie arrange each group by value of the "startRow" field in ascending order. 它还应该在排序和分组时考虑“startRow”字段,即按“startRow”字段的值按升序排列每个组。

Out put should be like this: 出局应该是这样的:

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

you have to write your own comparator, so that it does what you want with the object of your specific and specialized collection.. 你必须编写自己的比较器,以便它能够根据你的特定和专门的集合对象做你想做的事情。

try to give a look here Interface Comparator 试着看看这里的Interface Comparator

EDIT: probably comparable is even better as the other answer suggests 编辑:正如另一个答案所暗示的那样,可能相差甚至更好

Simple implement the Comparable Interface of Java, override the compareTo function as required and push your RecordGroups to a SortedSet, like TreeSet or sth. 简单地实现Java的Comparable Interface,根据需要覆盖compareTo函数,并将RecordGroups推送到SortedSet,如TreeSet或sth。

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

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

Update: If you need different sortings for different Locations, a Entity-bound compare function would ofc. 更新:如果您需要为不同的位置进行不同的排序,则实体绑定的比较功能将会出现。 not be what you want to implement. 不是你想要实现的。 (It will be equal through the whole system). (整个系统将是平等的)。 If this is the Case, just use a Comperator per sorting case. 如果是这种情况,只需在每个排序情况下使用一个Comperator。

You should probably implement the java.lang.Comparable interface: 您应该实现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
  }
}

Comparator does this for you Comparator 比较器为您做比较

use following code. 使用以下代码。

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

to check working demo go to http://ideone.com/rsM9Un for demo Here startRow is in ascending Order 要查看工作演示,请访问http://ideone.com/rsM9Un进行演示此处startRow按升序排列

Output : 输出:

[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
]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM