例如,在"SQL I have a SELECT*FROM db ORDER by first,middle,last ASC"中,输出将按名字排序,然后按中间名排序,对吗?如何在Java中获得具有相同输出的可比较函数?希望你能理解我在这里的意思。非常感谢。
我有以下样品;
public static final Comparator<Person> NameCompare = new Comparator<Person>()
{
public int compare(Person o1, Person o2) {
return o2.first().compareTo(o1.first()) == 0 ? o2.first().compareTo(o1.first()) : o2.middle().compareTo(o1.middle()) == 0 ? o2.middle().compareTo(o1.last()) : o2.property().compareTo(o1.last());
}
};
编辑:样本排序订单:
- Abc Bcd Efg
- Abc Def Ghi
- Cde Fgh Ijk
- Cde Fgh Lmn
- Hij Ijk Lmn
- Zee Why Bee
如果您使用的是Java 8,您可以执行:
Comparator<Person> comp = Comparator.comparing(Person::getFirst)
.thenComparing(Person::getMiddle)
.thenComparing(Person::getLast);
并对列表进行排序:
List<Person> people = ...;
people.sort(comp);
试试这个:
public static final Comparator<Person> NameCompare = new Comparator<Person>()
{
public int compare(Person o1, Person o2) {
int i = o1.first.compareTo(o2.first);
if (i != 0) return i;
i = o1.middle.compareTo(o2.middle);
if (i != 0) return i;
return o1.last.compareTo(o2.last);
}
如果您使用JDK<8.
像Guava和Apache Commons Lang这样的库提供了一种实用程序,可以使链接比较方法变得更容易(代码直接从它们的文档中提取,只是为了给你一个想法。在Comparator
中使用它需要一点技巧。):
番石榴
public int compareTo(Foo that) {
return ComparisonChain.start()
.compare(this.aString, that.aString)
.compare(this.anInt, that.anInt)
.compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast())
.result();
}
Apache Commons Lang 2/3
public int compareTo(Object o) {
MyClass myClass = (MyClass) o;
return new CompareToBuilder()
.appendSuper(super.compareTo(o)
.append(this.field1, myClass.field1)
.append(this.field2, myClass.field2)
.append(this.field3, myClass.field3)
.toComparison();
}