Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多字段上的自定义比较器_Java_Comparator - Fatal编程技术网

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;
}
我希望通过以下方式实现自定义排序顺序:

  • 名称为“name”的所有属性都应位于顶部
  • 所有属性都必须为true,如果两个字段必须为true,则应在sortIndex上对其进行进一步排序
  • 所有属性的active=true但importional=false,如果两个字段的active=true和importional=false,则应在sortIndex上对它们进行进一步排序
  • 所有剩余属性都应按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());
        }
    }