不太确定我该如何攻击它。我需要为名为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...
}
}
答案 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实现它。