Java 不同属性组合的ArrayList排序对象
我的课是这样的:Java 不同属性组合的ArrayList排序对象,java,collections,arraylist,comparator,comparable,Java,Collections,Arraylist,Comparator,Comparable,我的课是这样的: class Employee{ int age; String name; int empId; . . . } Collection.sort(cars, new CarComparator("brand", "mileage")); 在main方法中,我创建了Employee类的对象,并将其保存在ArrayList say objEmpList中。 现在,我的要求是像SQL语句一样将objEmpList排序为, 按年龄、姓名、empId从员工
class Employee{
int age;
String name;
int empId;
.
.
.
}
Collection.sort(cars, new CarComparator("brand", "mileage"));
在main方法中,我创建了Employee类的对象,并将其保存在ArrayList say objEmpList中。
现在,我的要求是像SQL语句一样将objEmpList排序为,
按年龄、姓名、empId从员工订单中选择*;
Measn,我希望结果按年龄、姓名和empId的顺序排序
例如:
我的数据如下:
10 Nirdesh 1
10安贝什222
9拉梅什9
12阿马尔3
所以我的结果应该是,
9 Ramesh 9
10 Ambesh 222
10 Ramesh 1
12 Amar 3
如何实现此要求?让员工实现可比性,然后调用集合。排序(列表)
您应该实现一个实现Comparator的新类EmployeeComparator。通过指定字段名的vararg列表来配置字段顺序
public EmployeeComparator(字符串…字段)
以下是一个例子:
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);
}
}
}
您的值对象中的每个字段都需要访问器(即getter和setter),上面的示例在处理非字符串字段时会遇到一些问题。但是我想我应该把一些乐趣留给你
祝你好运 -如果要基于对象的多个属性进行排序,可以使用
java.util.Comparator
接口。
-您必须使用Collections.sort(列表l,比较器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();
}
}
import java.util.ArrayList;
导入java.util.Collections;
导入java.util.Comparator;
班车{
私有字符串名称;
自有品牌;
私人双重成本;
公共汽车(字串名称、字串品牌、双倍成本){
this.name=名称;
这个品牌=品牌;
成本=成本;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getBrand(){
回归品牌;
}
公共品牌(字符串品牌){
这个品牌=品牌;
}
公共成本{
退货成本;
}
公共成本(双倍成本){
成本=成本;
}
公共字符串toString(){
返回getName();
}
}
公营猪{
ArrayList cars=新的ArrayList();
公共无效setIt(){
添加(新车(“Padmini”,“菲亚特”,100008.00));
添加(新车(“XYlo”,“Mahindra”,100000.00));
添加(新车(“Swift”、“Maruti”,200000.00));
}
公共无效sortIt(){
Collections.sort(cars,newnamecomparator());
系统输出打印(cars);
Collections.sort(cars,newbrandcomparator());
系统输出打印(cars);
Collections.sort(cars,newcostcomparator());
系统输出打印(cars);
}
类NameComparator实现Comparator{
公共int比较(车辆c1、车辆c2){
返回c1.getName().compareTo(c2.getName());
}
}
类BrandComparator实现Comparator{
公共int比较(车辆c1、车辆c2){
返回c1.getBrand().compareTo(c2.getBrand());
}
}
类CostComparator实现Comparator{
公共int比较(车辆c1、车辆c2){
返回新的Double(c1.getCost()).compareTo(新的Double(c2.getCost());
}
}
公共静态void main(字符串[]args){
Hog h=新的Hog();
h、 setIt();
h、 sortIt();
}
}
除了上述评论之外,您是否做过任何研究?有谷歌搜索吗?我试着用每个hashcode()添加所有属性的结果,用其他具有可比界面的属性进行减法。但这不起作用。是的,我厌倦了谷歌,但找不到解决方案。你应该使用可比界面和属性,实现你自己的algorith@Nirdesh,请在下面检查我的答案。你应该可以接受的!但是在compareTo()方法中,如何根据这3个属性进行排序。负整数、零或正整数,因为此对象小于、等于,或大于指定的对象。我不知道如何实现排序代码。您可以编写一个实现上述功能的代码吗order@Nirdesh:试着自己上网搜索。不要指望用勺子喂食总是好的。请以肯定的态度看待这个问题manner@Nirdesh:检查我关于使用反射的回答。这是一个关于从何处开始搜索的提示。如果有很多字段,那么可能会有很多比较器。此外,如果你想先按品牌再按成本订购,那你就麻烦了,对吗?@Markus,我们到现在为止还没有感受到这一点。。。。我参加过一个项目,该项目用8种不同的方式对一个对象进行排序。。。。嗯,编程的风格很有争议,我更喜欢这种方式,因为到目前为止,我已经非常完美地使用它。。。如果您能为我提供更好的解决方案,这将是一种荣誉,也是一种学习经历,我将非常感谢您…检查我的更新答案。+1正确应用干燥原理(不要重复)
Collection.sort(cars, new CarComparator("brand", "mileage"));
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();
}
}