如何按对象的多个属性排序 - linq4j

时间:2017-03-10 04:39:51

标签: java linq4j

我正在使用linq4j。我只按一个属性排序,并希望按多个属性排序。如果在linq4j中不支持,那么我可以使用其他方法。以下是我的代码段

import java.util.Arrays;
import java.util.List; 
import net.hydromatic.linq4j.Linq4j;
import net.hydromatic.linq4j.function.*;

public class Linq4jExample {
 public static class Employee {
 public final int empno;
 public final String name;
 public final int deptno;

public Employee(int empno, String name, int deptno) {
  this.empno = empno;
  this.name = name;
  this.deptno = deptno;
}

public String toString() {
  return "Employee(empno: " + empno +",name: " + name + ", deptno:" + deptno    + ")";
 }
 }

public static final Employee[] emps = {
  new Employee(100, "Fred", 10),
  new Employee(110, "Bill", 30),
  new Employee(120,  "Bill", 10),
  new Employee(120, "Eric", 12),
  new Employee(130, "Janet", 13),
};

public static final Function1<Employee, Integer> EMP_DEPTNO_SELECTOR =
  new Function1<Employee, Integer>() {
    public Integer apply(Employee employee) {
      return employee.deptno;
    }
     };

public static void main(String[] args) {

  List<Employee> filter=Linq4j.asEnumerable(Arrays.asList(emps)) 
            .orderBy(new Function1<Employee,String>()
        { 
        public String apply(Employee arg0)
        {
            return arg0.name;
        }

    }).toList();

  }
 }

潜在用例可以按部门编号排序,然后按名称

进行排序

1 个答案:

答案 0 :(得分:1)

您可以在linq4j中拥有多个订单。请查看以下示例

package maven_lab;

import java.util.Arrays;
import java.util.List;

import org.apache.calcite.linq4j.Linq4j;
import org.apache.calcite.linq4j.function.Function1;

public class Linq4jExample {

    public static final Employee[] emps = {
            new Employee(100, "Fred", 10),
            new Employee(110, "Bill", 30),
            new Employee(120, "Bill", 10),
            new Employee(120, "henry", 10),
            new Employee(120, "Adam", 10),
            new Employee(120, "Eric", 12),
            new Employee(130, "Janet", 13),
    };

    public static final Function1<Employee, Integer> EMP_DEPTNO_SELECTOR =
            new Function1<Employee, Integer>() {
                public Integer apply(Employee employee) {
                    return employee.deptno;
                }
            };

    public static void main(String[] args) {

        List<Employee> filter = Linq4j.asEnumerable(Arrays.asList(emps)).orderBy(e -> e.deptno)
            .orderBy(e -> e.name).toList();

        System.out.println(filter);

    }

    public static class Employee {
        public final int empno;
        public final String name;
        public final int deptno;

        public Employee(int empno, String name, int deptno) {
            this.empno = empno;
            this.name = name;
            this.deptno = deptno;
        }

        public String toString() {
            return "Employee(empno: " + empno + ",name: " + name + ", deptno:" + deptno + ")";
        }
    }


}

请注意,我先按部门订购然后再按名称订购。您还应该使用jdk8 lambda而不是匿名类。

在JDK8之前,你可以像下面这样做,

 List<Employee> filter = Linq4j.asEnumerable(Arrays.asList(emps)).orderBy(new Function1<Employee, Integer>() {
            public Integer apply(Employee arg0) {
                return arg0.deptno;
            }

        }).orderBy(new Function1<Employee, String>() {
            public String apply(Employee arg0) {
                return arg0.name;
            }

        }).toList();