【问题标题】:java compare to different optionsjava比较不同的选项
【发布时间】:2011-09-21 10:14:47
【问题描述】:

我已经实现了 compareTo 以允许我根据一些标准比较我的班级'并且它工作正常。

但是,在某些时候,我想在某件事上比较类,而在代码中的另一点,我想根据另一件事比较该类。

是否可以有两个不同的 compareTo 实现,并在某个时候使用一个,在另一个时候使用一个?

【问题讨论】:

    标签: java class compare


    【解决方案1】:

    一般来说,实现这一点的机制是实现一个或多个Comparators,并根据需要使用适当的。

    【讨论】:

      【解决方案2】:

      由于您的类是“可比较的”,您可以使用 compareTo,但是您不能创建多个该函数的实现以在同一类的不同点使用(您有一个要覆盖的函数,并且你不能这样做两次)。

      不过,您可以查看Comparator Interface;并且该接口的实现可以让您为您的对象实现和使用不同的 compareTo。

      【讨论】:

        【解决方案3】:

        我们通过为我们的类编写一个实用比较器实现了类似的效果 - 如下所示:

        public class FooComparator implements Comparator<Foo> {
        
            public static String COMPARE_FIELD1 = "COMPARE_FIELD1";
            public static String COMPARE_FIELD2 = "COMPARE_FIELD2";
            public static String COMPARE_FIELD3 = "COMPARE_FIELD3"; 
            private String compareBy = COMPARE_FIELD1;
            private boolean reverse = true;
        
            public FooComparator(){}
        
            public FooComparator(String sort){
                compareBy = sort;
            }
        
            public void reverse() {
                if(reverse) {reverse = false;
                } else {reverse = true;}
            }
        
            public void field1Sort() {compareBy = COMPARE_FIELD1;}
            public void field2Sort() {compareBy = COMPARE_FIELD2;}
            public void field3Sort() {compareBy = COMPARE_FIELD3;}
        
            public int compare(Foo foo1, Foo foo2) {
                if(compareBy.equals(COMPARE_FIELD2)) {
                    return compareByField2(foo1, foo2);
                } else if(compareBy.equals(COMPARE_FIELD3)) {
                    return compareByField3(foo1, foo2);
                } 
                return compareByField1(foo1, foo2);
            }
        
            private int compareByField1(Foo foo1, Foo foo2) {       
                if(reverse) {return foo1.getField1().compareTo(foo2.getField1());}
                return foo1.getField1().compareTo(foo2.getField1());        
            }
        
            private int compareByField2(Foo foo1, Foo foo2) {       
                if(reverse) {return foo1.getField2().compareTo(foo2.getField2());}
                return foo1.getField2().compareTo(foo2.getField2());        
            }
        
            private int compareByField3(Foo foo1, Foo foo2) {       
                if(reverse) {return foo1.getField3().compareTo(foo2.getField3());}
                return foo1.getField3().compareTo(foo2.getField3());        
            }   
        }
        

        然后我们可以这样使用它:

        List<Foo> foos = new ArrayList<Foo>();
        FooComparator comparator = new FooComparator(FooComparator.COMPARE_FIELD1);     
        Collections.sort(foos, comparator);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-16
          • 2020-09-20
          • 1970-01-01
          • 1970-01-01
          • 2019-01-05
          • 1970-01-01
          相关资源
          最近更新 更多