Java:根据子类型订购集合

时间:2011-06-09 15:08:55

标签: java types comparator

不太确定我该如何攻击它。我需要为名为Comparator的类创建Record。这些记录有我将要使用的时间,但如果时间相同,我需要根据它们的类型订购它们。比如说我们有以下Record个子类型:

  • AaRecord
  • BbRecord
  • CcRecord
  • DdRecord

现在,给定一个包含大量这些内容的集合,我需要对它们进行排序,以便所有CcRecord来到BbRecord之后是AaRecord,最后是DdRecord 。这样做的好方法是什么?

为了清楚起见,我不能使用类型的名称来做到这一点,因为它们可能是任何东西。它将用于以正确的顺序处理记录列表。

public class RecordComparator implements Comparator<Record>
{
   @Override
   public int compare(Record x, Record y)
   {
      // First compare times
      int result = x.getTime().compareTo(y.getTime());
      if(result != 0)
         return result;

      // Then somehow compare types...

   }
}

3 个答案:

答案 0 :(得分:4)

您可以定义包含所有类型的排序顺序的Map<Class, Integer>,然后执行以下操作:

@Override
public int compare(Record x, Record y)
{
   // First compare times
   int result = x.getTime().compareTo(y.getTime());
   if(result != 0)
      return result;

   // sortOrders is your map
   return sortOrders.get(x.getClass()).compareTo(sortOrders.get(y.getClass()));
}

或类似的东西。

请记住, 不是整数。

答案 1 :(得分:0)

如何使用建立类型顺序的方法,例如:

public abstract class Record
{
    public abstract int getRecordOrdinal();
}

public abstract class AaRecord extends Record
{
    @Override
    public int getRecordOrdinal() {
        return 1;
    }
}

public abstract class BbRecord extends Record
{
    @Override
    public int getRecordOrdinal() {
        return 2;
    }
}

//etc

public class RecordComparator implements Comparator<Record>
{
   @Override
   public int compare(Record x, Record y)
   {
      // First compare times
      int result = x.getTime().compareTo(y.getTime());
      if(result != 0)
         return result;

      return y.getRecordOrdinal() - x.getRecordOrdinal();
   }
}

答案 2 :(得分:0)

虽然这听起来像是让我们开展工作,但以下是如何解决问题的大纲:

(1)为一个抽象方法getSortOrder()

扩展Record类
public abstract class Record {
    public abstract int getSortOrder();
}

(2)在您的子类型AaRecord,BbRecord,CcRecord中实现此方法,...按照您希望的方式进行排序,例如:

public class AaRecord {
    @Override
    public int getSortOrder() {return 0; }
}

public class BbRecord {
    @Override
    public int getSortOrder() {return 1; }
}

等等。

(3)RecordComparator实现

public class RecordComparator implements Comparator<Record>
    {
       @Override
       public int compare(Record x, Record y)
       {
          // First compare times
          int result = x.getTime().compareTo(y.getTime());
          if(result != 0)
             return result;

          // Compare types
          return x.getSortOrder() - y.getSortOrder();
       }
    }

或者,您可以定义一个额外的接口Sortable {int getSortOrder();并且让Record实现它。