Java:按顺序比较三个不同的字段.就像SQL数据库一样



例如,在"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());
    }
};

编辑:样本排序订单:

  1. Abc Bcd Efg
  2. Abc Def Ghi
  3. Cde Fgh Ijk
  4. Cde Fgh Lmn
  5. Hij Ijk Lmn
  6. 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();
}

相关内容

最新更新