2

我想对这个 Arraylist 进行排序

public List<Machine> machines;

machines = machineController.execute().get();
Collections.sort(machines, new Comparator<Machine>() {
    public int compare(Machine obj1, Machine obj2)
    {
        return obj1.getManufacturer().compareToIgnoreCase(obj2.getManufacturer());
    }
});

现在列表向我显示了从 A 到 Z 的制造商。效果很好。

宝马Z1,

小轮车 X6,

大众捷达,

大众高尔夫,

问题是:如何按制造商和型号排序?(obj.getManufaturer & obj.getModel)

宝马X6,

宝马Z1,

大众高尔夫,

大众捷达

4

2 回答 2

4

您需要在您的机器类中覆盖“比较”以按制造商和型号进行排序。如果你看你现在拥有它的方式,你只是在按制造商进行比较。您想通过“机器”作为一个整体进行比较。

这应该足以解决您的问题,但是如果您想要示例代码,请告诉我,我可以编辑这篇文章:)

编辑:我测试的工作示例:

在您的 Machine 类内部使用:

public class Machine implements Comparable<Machine>

然后,您需要:

@Override
public int compareTo(Machine o) {
    if (manufacturer.compareToIgnoreCase(o.manufacturer) == 0)
        return model.compareToIgnoreCase(o.model);
    else
        return manufacturer.compareToIgnoreCase(o.manufacturer);
}

然后,您可以简单地调用:

Collections.sort(machines);

快乐编码!

这是我个人用于测试的确切代码:

public class Machine implements Comparable<Machine> {

private String manufacturer;
private String model;
private double price;

public Machine(String man, String mod) {
    this(man, mod, 0);
}

public Machine(String man, String mod, double p) {
    manufacturer = man;
    model = mod;
    price = p;
}

/**
 * @return the manufacturer
 */
public String getManufacturer() {
    return manufacturer;
}

/**
 * @return the model
 */
public String getModel() {
    return model;
}

public double getPrice() {
    return price;
}

@Override
public int compareTo(Machine o) {
    if (manufacturer.compareToIgnoreCase(o.manufacturer) == 0)
        return model.compareToIgnoreCase(o.model);
    else
        return manufacturer.compareToIgnoreCase(o.manufacturer);
}

@Override
public String toString() {
    return manufacturer.toString() + " " + model.toString();
}

}

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Blah {
    public static void main(String[] args) {
        List<Machine> machines = new ArrayList<>();

        machines.add(new Machine("Volkswagen", "Jetta"));
        machines.add(new Machine("Volkswagen", "Golf"));
        machines.add(new Machine("BMW", "Z1"));
        machines.add(new Machine("BMW", "X6"));

        Collections.sort(machines);

        for (Machine m : machines)
            System.out.println(m.toString());
    }
}

对我来说,这输出:

BMW X6
BMW Z1
Volkswagen Golf
Volkswagen Jetta
于 2013-10-30T15:05:29.093 回答
1

你可以这样做:

public int compare(Machine obj1, Machine obj2){
    if (obj1.getManufacturer().compareToIgnoreCase(obj2.getManufacturer()) != 0) {
        return obj1.getManufacturer().compareToIgnoreCase(obj2.getManufacturer());
    } else {
        return obj1.getModel().compareToIgnoreCase(obj2.getModel());
    }
}
于 2013-10-30T15:06:00.450 回答