Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不同属性组合的ArrayList排序对象_Java_Collections_Arraylist_Comparator_Comparable - Fatal编程技术网

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

}