【问题标题】:Two comparators in one class一类中的两个比较器
【发布时间】:2013-02-25 14:10:16
【问题描述】:

我有两个类,都有 int ID 属性,我必须创建这个 Comparator 类两次才能按 ID 对它们进行排序:

public class Class1Comparator implements Comparator<Class1> {

/**
 * Comparator Constructor.
 */
public Class1Comparator() {
}

@Override
public int compare(Class1 arg0, Class1 arg1) {
    return arg0.getId() - arg1.getId();
}
}

和完全相同的一个,但 Class2 而不是 Class1,一切正常,但是有没有办法将它们合并到一个类中?

【问题讨论】:

    标签: java list class sorting comparator


    【解决方案1】:

    从包含公共 ID 的基类中派生 Class1Class2,以及 Comparator&lt;BaseClass&gt; 的单个实现。

    例子:

    public class BaseClass
    {
        private int id;
    
        //.
        //.
        //.
    
        public static class CmpID implements Comparator<BaseClass>
        {
            @Override
            public int compare(BaseClass a, BaseClass b) {
                //Could be implemented null safe
                return a.id - b.id;
            }
        }
    }
    

    编辑:您还可以实现一个通用接口,例如

    public interface IdentifiableObject
    {
        int getId();
    }
    

    Class1Class2 使用。 在这里,Comparator&lt;IdentifiableObject&gt; 的单个实现就足够了。

    【讨论】:

    • 这对我来说不是一个好主意,还有其他事情要做吗?
    • @codeoverflow:如果你不说为什么 Sam 的想法不适合你,我们怎么知道还有什么是合理的?例如,您可以使用接口而不是使用基类......但同样,这可能不适合您的情况。
    • 我尝试例如实现 Comparator、Comparator,但这不起作用
    • 使用 IdentifiableObject 是一个更好的主意,谢谢!
    【解决方案2】:

    创建一个接口 GetId,该接口定义实现它的类必须具有 getId() 方法。让您的类实现该接口,然后创建一个比较器,该比较器将实现该接口的任何类作为其参数。

    【讨论】:

      【解决方案3】:

      将 Comparator 类称为不同的更通用的名称,并更改为 . 这将允许您将相同的 Comparator 用于不同的类。

      【讨论】:

        【解决方案4】:

        基本上没有适当的解决方案来解决您的问题,因为如果您尝试比较两个不同类的实例,则会导致 ClassCastException,因为只能在属于同一类的对象之间进行比较。一种解决方案可能是按照sam 的建议从另一个类扩展一个类。

        【讨论】:

          【解决方案5】:
          • 如果类有一个共同的祖先,使用它来获取 ID 和
            进行比较。
          • 稍微拉伸一下 - 您可以使用反射来获取 每个类的 id 属性。此解决方案会很慢且不可取。
          • 如果没有共同祖先并且您不控制代码库,那么您就不走运了。您当然可以进一步扩展它并使用动态代理来模拟duck typing in java,但投资回报率会非常低:)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-18
            • 2020-10-04
            • 1970-01-01
            • 2012-02-03
            • 1970-01-01
            相关资源
            最近更新 更多