2012-11-26 172 views
-2

我班的ArrayList對象排序是這樣的:具有不同屬性的組合

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

在我創建Employee類的對象,並將其保存在ArrayList中的主要方法說objEmpList。 現在,我的要求是像objEmpList那樣對SQL Statemnt進行排序,如 Select * From Employee Order by age,name,empId; Measn,我想按年齡順序排序的結果,名稱& empId。 3

所以我的結果應該是,

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

我怎樣才能實現 10 Nirdesh 1 10 Ambesh 222 9拉梅什9 12阿瑪爾:

對於例如: 我的數據是像這個要求?

+2

除了 - 你做了任何研究嗎?任何谷歌搜索? –

+0

我嘗試添加每個hashcode()的所有atrributes的結果,並與可比Interface.But的其他人相比,這是行不通的。 – Nirdesh

+0

雅我累了谷歌,但無法找到解決方案。 – Nirdesh

回答

0

使員工實現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); 
+0

但是在compareTo()方法中,我如何根據這3個屬性進行排序。 – Nirdesh

+0

由於此對象小於,等於或大於指定對象,因此爲負整數,零或正整數。 –

+0

我很困惑我應該如何實現排序代碼。你可以按照上面提到的順序編寫代碼 – Nirdesh

1

你應該實現一個新的類EmployeeComparator實現比較。通過指定字段名稱的可變參數列表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")); 

你需要爲每個字段的存取(即getter和setter)在你的價值對象,上面的例子在非字符串字段中會遇到一些麻煩。但我想我應該留給你一些樂趣! :)

祝你好運!

+0

+1的順序,以正確應用DRY原則(不要重複自己) –

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(); 
    } 

} 
從上面的評論
+0

如果有很多字段,最終可能會有很多比較器。另外,如果你想按品牌訂購,然後按成本訂購,那麼你遇到了麻煩,對吧? – Markus

+0

@Markus,那麼到現在爲止,我從來沒有感受到這種熱度....我一直在一個項目中,以8種不同的方式處理一個對象......編程風格相當有爭議,我更喜歡它這樣,到目前爲止,我已經完美無瑕地使用這種方式航行......如果你能爲我提供更好的解決方案,我將非常感激並且相當學習,我將非常感謝你...... –

+0

檢查我的更新回答。 – Markus

相關問題