通过对扩展公共父类的类使用优先级,实现Java comparator

通过对扩展公共父类的类使用优先级,实现Java comparator,java,guava,comparator,Java,Guava,Comparator,我需要用Java实现几个比较器 我有很多已知的类,A1,A2,A3,…,An,它们都扩展了类a。我想要的是一个基于番石榴的comparator类,如下所示: Ordering<A> sorterType1 = new Ordering<A>() { // Here, provide a Set or something similar that keeps in memory // the class types and the assoc

我需要用Java实现几个比较器

我有很多已知的类,
A1
A2
A3
,…,
An
,它们都扩展了类
a
。我想要的是一个基于番石榴的comparator类,如下所示:

Ordering<A> sorterType1 = new Ordering<A>() {
        // Here, provide a Set or something similar that keeps in memory
        // the class types and the associated priority. 

        @Override
        public int compare(A left, A right) {
           // return -1 if class of left has an higher priority wrt class of right; 
           // return  0 if class of left has the same priority wrt class of right; 
           // return  1, otherwise.
        }
Ordering sorterType1=new Ordering(){
//在这里,提供一个集合或类似的东西保存在内存中
//类类型和关联的优先级。
@凌驾
公共整数比较(左、右){
//如果左侧的类具有更高的优先级,则返回-1;
//如果左侧的类与右侧的wrt类具有相同的优先级,则返回0;
//返回1,否则返回。
}
因为我需要开发很多不同的比较器,所以我不想把优先级放在类类型中,因为每个比较器有几个不同的优先级。 我缺少的是带有注释的部分


带注释的部件的最有效和最高效的实现是什么?

不要自己编写比较实现,使用
排序
超级能力(确切地说):


List不要自己编写比较实现,使用
Ordering
super powers(确切地说):


ListSo每个类都包含一个优先级值吗?即父类有一个抽象的
getPriority()
方法返回一个
int
?否!必须在排序中指定优先级作为最终值。您希望类的顺序是什么?目前,我不知道如何解决这个问题,除非您想要一个如中所示的静态列表。是的,Xaerxess抓住了重点!他的解决方案满足了我的需要!每个类是否都包含一个优先级值?即父类有一个抽象的
getPriority()
方法返回一个
int
?不!必须在排序中指定优先级作为最终值。您希望类的顺序是什么?目前,我不知道如何解决这个问题,除非您想要一个如中所示的静态列表。是的,Xaerxess抓住了重点!他的解决方案满足了我的需要!非常完美!这正是我一直在找的!Thanks@Xaerxess我一点也不懂这个问题,但我喜欢这个答案。:+1暗示完美!这正是我想要的!Thanks@Xaerxess我一点也不懂这个问题,但我喜欢这个答案
List<Class<? extends A>> myOrder = ImmutableList.of(
    A1.class, A4.class, A3.class, A2.class);
Ordering<A> explicitByClassOrdering = Ordering.explicit(myOrder)
    .onResultOf(new Function<A, Class<? extends A>>() {
      @Override public Class<? extends A> apply(A a) {
        return a.getClass();
      }
    });

System.out.println(explicitByClassOrdering.sortedCopy(
    ImmutableList.of(new A3(), new A2(), new A3(), new A1(), new A4())));
// [Test$A1, Test$A4, Test$A3, Test$A3, Test$A2]