【问题标题】:Java: how to sort and group a list of objects by their attributesJava:如何按属性对对象列表进行排序和分组
【发布时间】:2013-10-09 17:39:17
【问题描述】:

例如,我有一个名为 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 mergeMap = new ArrayList();

    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 对象列表进行排序,以便它可以按所有者对记录进行分组,即第一个“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));

【问题讨论】:

标签: java sorting object attributes


【解决方案1】:

简单实现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。

【讨论】:

    【解决方案2】:

    您可能应该实现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
      }
    }
    

    【讨论】:

    • compareTo 以小写开头
    • 你是对的!我编辑了答案。谢谢指正。
    【解决方案3】:

    您必须编写自己的比较器,以便它对您的特定和专用集合的对象执行您想要的操作..

    试试看这里Interface Comparator

    编辑: 正如其他答案所暗示的那样,可能具有可比性甚至更好

    【讨论】:

      【解决方案4】:

      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
      ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-01
        • 2022-01-21
        • 2018-10-11
        • 1970-01-01
        • 2011-08-13
        • 1970-01-01
        相关资源
        最近更新 更多