我想通过提供自定义顺序对包含不相关对象的列表进行排序。例如,我要排序的列表包含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
}
AFAIK,这完全取决于您如何确定自定义订购。例如,假设您在 Animal
类中有一个 size
属性,那么您将使用该属性来比较比较
方法中的大小。如果确定排序的因素不是 Animal
类的属性,则必须按照在代码段中执行此操作的方式对其进行硬编码。
我希望你的例子是糟糕的,你实际上没有这样做,因为这确实是一个糟糕的概念。也许你应该重新考虑你的类层次结构,因为我不明白对不相关的对象进行排序的意义。
因为您留下了<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()));
}
}
然而,在更一般的情况下,我建议您只比较逻辑上相似并因此共享某些属性或方法的对象。
比如说:
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