Java 多字段上的自定义比较器
我有一个类,定义为:Java 多字段上的自定义比较器,java,comparator,Java,Comparator,我有一个类,定义为: class Attribute { String name; Boolean active; Boolean obligatory; Integer sortIndex; } 我希望通过以下方式实现自定义排序顺序: 名称为“name”的所有属性都应位于顶部 所有属性都必须为true,如果两个字段必须为true,则应在sortIndex上对其进行进一步排序 所有属性的active=true但importional=false,如果两个字段的a
class Attribute {
String name;
Boolean active;
Boolean obligatory;
Integer sortIndex;
}
我希望通过以下方式实现自定义排序顺序:
public class AttributeComparator implements Comparator<Attribute> {
List<Comparator<Attribute>> comparators = Arrays.asList(new NameAttributeComparator(),
new ObligatoryAttributeComparator(), new ActiveAttributeComparator(),
new SortIndexComparator());
@Override
public int compare(Attribute o1, Attribute o2) {
for (Comparator<Attribute> c : comparators) {
int result = c.compare(o1, o2);
if (result != 0) {
return result;
}
}
return 0;
}
公共类AttributeComparator实现Comparator,以提供当前解决方案
中的场景与此稍有不同,因为在这里,具有相同值的元素应该在sortIndex上进一步排序 您的义务属性比较器返回一个值!=0如果
!o1.强制性的&!o2.O.1.sortIndex!=o2.sortIndex
因此,根本不需要咨询ActiveAttributeComparator
。您的义务属性比较器
返回一个值!=0如果
!o1.强制性的&!o2.O.1.sortIndex!=o2.sortIndex
因此根本不需要咨询ActiveAttributeComparator
。activecomparator到底有什么问题?你能提供一个例子吗?@AdamSkywalker:使用ActiveAttributeComparator,active=false和Constructive=false的字段位于active=true的字段之前。预期结果是active=false和Constructive=false的字段应显示在active=True的所有字段下方。您是否尝试过Java 8和Comparator。比较和Comparator。然后比较?@tobias_k:我使用的应用程序尚未移植到Java 8。但是Java8将是一个很好的选择。谢谢有源比较器到底出了什么问题?你能提供一个例子吗?@AdamSkywalker:使用ActiveAttributeComparator,active=false和Constructive=false的字段位于active=true的字段之前。预期结果是active=false和Constructive=false的字段应显示在active=True的所有字段下方。您是否尝试过Java 8和Comparator。比较和Comparator。然后比较?@tobias_k:我使用的应用程序尚未移植到Java 8。但是Java8将是一个很好的选择。谢谢
class NameAttributeComparator implements Comparator<Attribute> {
@Override
public int compare(Attribute o1, Attribute o2) {
int comparisonResult = 0;
if (o1.getName().equals("Name") && !o2.getName().equals("Name")) {
comparisonResult = -1;
} else if (o2.getName().equals("Name") && !o1.getName().equals("Name")) {
comparisonResult = 1;
}
return comparisonResult;
}
}
public class ObligatoryAttributeComparator implements Comparator<Attribute> {
@Override
public int compare(Attribute o1, Attribute o2) {
int comparisonResult = 0;
comparisonResult = o2.isObligatory().compareTo(o1.isObligatory());
if (comparisonResult == 0) {
comparisonResult = o1.getSortIndex().compareTo(o2.getSortIndex());
}
return comparisonResult;
}
}
class ActiveAttributeComparator implements Comparator<Attribute> {
@Override
public int compare(Attribute o1, Attribute o2) {
int comparisonResult = o2.isActive().compareTo(o1.isActive());
if (comparisonResult == 0) {
return o1.getSortIndex().compareTo(o2.getSortIndex());
}
return comparisonResult;
}
}
class SortIndexComparator implements Comparator<Attribute> {
@Override
public int compare(Attribute o1, Attribute o2) {
return o1.getSortIndex().compareTo(o2.getSortIndex());
}
}