-3

私のクラスは次のようなものです:

class Employee{
  int age;
  String name;
  int empId;
  .
  .
  . 
 }

メインメソッドで、Employee クラスのオブジェクトを作成し、それを ArrayList に保存して、objEmpList とします。ここで、私の要件は、SQL ステートメントのように objEmpList を次のように並べ替えることです。 Select * From Employee Order by age,name,empId; Measn、年齢、名前、empId の順に結果を並べ替えたいと思います。

例: 私のデータは次のようなものです: 10 Nirdesh 1 10 Ambesh 222 9 Ramesh 9 12 Amar 3

だから私の結果は、

 9    Ramesh  9
 10   Ambesh  222
 10   Ramesh  1 
 12   Amar    3

どうすればこの要件を達成できますか?

4

3 に答える 3

2

Comparatorを実装する新しいクラスEmployeeComparatorを実装する必要があります。フィールド名のvarargリストを指定して、フィールドの順序を構成しますpublic EmployeeComparator(String... fields)

次に例を示します。

public class CarComparator implements Comparator<Car> {

private final List<String> fieldSortOrder;

public CarComparator(String... fieldSortOrder) {
    this.fieldSortOrder = new ArrayList<String>(
            Arrays.asList(fieldSortOrder));
}

@Override
public int compare(Car a, Car b) {
    try {
        return cmp(a, b, fieldSortOrder);
    } catch (Exception e) {
        return 0;
    }
}

private int cmp(Car a, Car b, final List<String> fields) throws Exception {
    if (fields.isEmpty())
        return 0;

    PropertyDescriptor pd = new PropertyDescriptor(fields.get(0), Car.class);
    String ma = (String) pd.getReadMethod().invoke(a);
    String mb = (String) pd.getReadMethod().invoke(b);
    if (ma.compareTo(mb) == 0) {
        return cmp(a, b, fields.subList(1, fields.size()));
    } else {
        return ma.compareTo(mb);
    }
}

}

次に、リストを次のように並べ替えます。

Collection.sort(cars, new CarComparator("brand", "mileage"));

値オブジェクトの各フィールドにアクセサー(つまり、ゲッターとセッター)が必要になります。上記の例では、文字列以外のフィールドで少し問題が発生します。しかし、私はあなたにいくつかの楽しみを任せるべきだと思います!:)

幸運を!

于 2012-11-26T07:25:17.177 に答える
2

-オブジェクトの複数の属性に基づいjava.util.Compartor<T>てソートする場合は、インターフェイスを使用できます。

-を使用する必要がありますCollections.sort(List<?> l, Comparator c)

例えば:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class Car {

    private String name;
    private String brand;
    private double cost;

    public Car(String name, String brand, double cost) {

        this.name = name;
        this.brand = brand;
        this.cost = cost;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public double getCost() {
        return cost;
    }

    public void setCost(double cost) {
        this.cost = cost;
    }

    public String toString() {

        return getName();
    }

}

public class Hog {

    ArrayList<Car> cars = new ArrayList<Car>();

    public void setIt() {

        cars.add(new Car("Padmini", "Fiat", 100008.00));
        cars.add(new Car("XYlo", "Mahindra", 100000.00));
        cars.add(new Car("Swift", "Maruti", 200000.00));
    }

    public void sortIt() {

        Collections.sort(cars, new NameComparator());
        System.out.println(cars);
        Collections.sort(cars, new BrandComparator());
        System.out.println(cars);
        Collections.sort(cars, new CostComparator());
        System.out.println(cars);
    }

    class NameComparator implements Comparator<Car> {

        public int compare(Car c1, Car c2) {

            return c1.getName().compareTo(c2.getName());
        }
    }

    class BrandComparator implements Comparator<Car> {

        public int compare(Car c1, Car c2) {

            return c1.getBrand().compareTo(c2.getBrand());
        }
    }

    class CostComparator implements Comparator<Car> {

        public int compare(Car c1, Car c2) {

            return new Double(c1.getCost()).compareTo(new Double(c2.getCost()));
        }
    }

    public static void main(String[] args) {

        Hog h = new Hog();

        h.setIt();
        h.sortIt();
    }

}
于 2012-11-26T07:42:43.453 に答える
0

Employee に Comparable を実装させ、Collections.sort(list); を呼び出します。

public class Employee implements Comparable<Employee> {

    // rest of class omitted

    public int compareTo(Employee e) {
       // Here's how you order by age, name, empId
       if (age != e.age) return age - e.age;
       if (!name.equal(e.name) return name.compareTo(e.name);
       return empId - e.empId;
    }
}

それで

Collections.sort(list);
于 2012-11-26T07:09:57.480 に答える