当前位置: 首页 > 知识库问答 >
问题:

Java-将不相关的对象与自定义顺序进行比较

谭修竹
2023-03-14

我想通过提供自定义顺序对包含不相关对象的列表进行排序。例如,我要排序的列表包含Animal类的对象。动物对象有一个名为type的对象,可以是猫、老鼠或狗。我有一个自定义订单鼠标

// Cat and Mouse are similar 
public class Dog {
    ...
}

public class Animal {
    Object type;

    public Animal(Object aType) {
        type = aType;
    }

    // getter , setter etc.
}

public class Comparison {

       List<Animal> animals;

       public Comparison() {
          Dog dog1 = new Dog();
          Animal animal1 = new Animal(dog);
          animals.add(animal1);
          Cat cat1 = new Cat();
          Animal animal2 = new Animal(cat);
          animals.add(animal2);
          // add other elements of type dog, cat or mouse
          ....
          // sort the list with custom order: mouse<cat<dog
          Collections.sort(animals,intComparator());
       }

    private Comparator<Animal> intComparator() {
        return new Comparator<Animal>() {
          @Override
          public int compare(Animal first, Animal second) {
              return ???;
      }
    };
  }

}

一种解决方案是手动检查类型的类(通过 instanceof)并在比较器中对顺序进行硬编码。但是,我有太多可以包含在 Animal 中的类(在本例中不仅包含三个类),因此这将产生大量的 if 案例。

    private Comparator<Animal> intComparator() {
        return new Comparator<FXNode>() {
          @Override
          public int compare(Animal first, Animal second) {
              // if first is a mouse, return -1 because it is the 'smallest' object
              if (first.getType() instanceof Mouse) return -1;
              // if first is a cat and second a mouse, return 1 etc., a lot of if cases
      }

共有3个答案

濮阳唯
2023-03-14

AFAIK,这完全取决于您如何确定自定义订购。例如,假设您在 Animal 类中有一个 size 属性,那么您将使用该属性来比较比较方法中的大小。如果确定排序的因素不是 Animal 类的属性,则必须按照在代码段中执行此操作的方式对其进行硬编码。

陆琦
2023-03-14

我希望你的例子是糟糕的,你实际上没有这样做,因为这确实是一个糟糕的概念。也许你应该重新考虑你的类层次结构,因为我不明白对不相关的对象进行排序的意义。

因为您留下了<code>比较器

public class CustomComparator implements Comparator<FXNode> {
    static Map<Class<? extends FXNode>,Integer> priorities = new HashMap<>();
    static {
        priorities.put(Node1.class,2);
        priorities.put(Node2.class,1);
    }

    @Override
    public int compare(FXNode o1, FXNode o2) {
        return Integer.compare(priorities.get(o1.getClass()),priorities.get(o1.getClass()));
    }   
}

然而,在更一般的情况下,我建议您只比较逻辑上相似并因此共享某些属性或方法的对象。

柳鸿博
2023-03-14

比如说:

enum Species { Cat, Dog, Mouse, ... };

class Animal {
  Species species;
};

然后对于比较器:

private Comparator<Animal> intComparator() {
  return new Comparator<FXNode>() {
    @Override
    public int compare(Animal first, Animal second) {
      return first.species.compareTo(second.species);
    }
  }
}

该顺序来自< code>enum。你可以附加属性(腿的数量,颜色等。)转换为< code>Species值。请参见Oracle教程。

 类似资料:
  • 问题内容: 我正在为我的通讯录应用程序实现排序功能。 我想排序一个。是一个包含四个字段的类:姓名,家庭电话,手机号码和地址。我想继续。 如何编写自定义排序功能来做到这一点? 问题答案: 这是有关订购对象的教程: Java教程-集合-对象排序 尽管我会举一些例子,但我还是建议你阅读它。 有多种排序方式。如果要定义自然的(默认)排序,则需要让实现。假设你想默认在上进行排序name,然后执行(为简单起见

  • 问题内容: 我有一个对象数组,这些对象的属性称为“ CODE”。 如何通过自定义顺序对数组进行排序,例如: 尝试各种方法均未成功。请帮忙。 问题答案: 您可以将函数与函数一起使用。

  • 我创建了一个,当调用变量为ISE时,它会读取相关数据的表。但是,如果我尝试将与另一个对象进行比较,无法正确读取。我想告诉脚本,如果现有CSV中的任何行与匹配,则不会将数据导出到CSV,换句话说,跳过CSV文件中的重复行。CSV可能有也可能没有多行。

  • 问题内容: 我想就这个小问题得到您的帮助。 我想根据 代码 值 而不是字母顺序 对数组 进行排序。 ( 我用粗体字指定了该名称,但最终还是被标记出来了,人们甚至都不在乎阅读该问题 ) 例如,我想有所有 绿色的 对象,那么所有的 蓝色 的人,然后将所有的 红色 的。最好的方法是什么? 使用 sort 函数可以做到这一点吗?在这种情况下会是什么情况? 问题答案: 您可以为所需订单取一个对象。 对于未知

  • 我得到一个错误-“错误:找不到适合排序(ArrayList)的方法。我如何修复这个问题? 多谢了。

  • 问题内容: 我正在使用ElasticSearch 2.4.2(通过Java的HibernateSearch 5.7.1.Final)。 我对字符串排序有问题。我的应用程序的语言带有变音符号,它们具有特定的字母顺序。例如,直接在after之后,在after之后,等等。因此,您应该对字符串进行如下排序: ElasticSearch首先按典型字母排序,然后将所有奇怪的字母移到最后: 我可以为Elasti