java - 使用 compareTo 和 Collections.sort

标签 java sorting collections comparable

我有一个特许经营类,其中包含所有者(特许经营权所有者的名称)、州(特许经营所在州的 2 个字符的字符串)和销售额(当天的总销售额)

public class Franchise implements Comparable <Franchise>  {
final String owner;
final String state;
final double sales;

protected Franchise(String owner, String state, double sales ) {
    this.owner = owner;
    this.state = state;
    this.sales = sales;
}
public String toString() {
    String str = state + ", " + sales + ", " + owner;
    return str;
}
public String getState() {
    return state;
}
public double getSales() {
    return sales;
}
public int compareTo(Franchise that) {
    double thatSales = that.getSales();
    if (this.getState().compareTo(that.getState()) < 0)  
        return -1;
    else if (this.getSales() > thatSales)
        return -1;
    else if (this.getSales() < thatSales)
            return 1;
    else
        return 0;
}
}

compareTo 基于状态 ASCENDING 和销售额 DESCENDING

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

public class FranchiseTester {

public static void main(String[] args) {
    ArrayList<Franchise> franchises = new ArrayList<Franchise>();
    Franchise a = new Franchise("Andrew Luck", "IN", 1270.5);
    Franchise b = new Franchise("Ray Rice", "MD", 1210);
    Franchise c = new Franchise("Alfred Morris", "WA", 980.5);
    Franchise d = new Franchise("Roddy White", "GA", 670);
    Franchise e = new Franchise("Greg Olsen", "SC", 740);
    Franchise f = new Franchise("T.Y. Hilton", "IN", 950);
    Franchise g = new Franchise("Julio Jones", "GA", 560);

    franchises.add(a);
    franchises.add(b);
    franchises.add(c);
    franchises.add(d);
    franchises.add(e);
    franchises.add(f);
    franchises.add(g);

    Collections.sort(franchises);

    for(int i = 0; i < franchises.size(); i++) {   
        System.out.print(franchises.get(i) + "\n");
    } 
}

}

当我在没有 Collections.sort 的情况下比较这些特许经营对象时,它们比较正确,但是当我像这里一样使用 Collections.sort 进行测试时,我得到如下输出这个:

GA, 670.0, Roddy White
GA, 560.0, Julio Jones
IN, 1270.5, Andrew Luck
IN, 950.0, T.Y. Hilton
MD, 1210.0, Ray Rice
SC, 740.0, Greg Olsen
WA, 980.5, Alfred Morris

各州的比较仍然正确,但它没有正确地按销售额进行比较(特定统计数据的较低销售额应该首先出现)

我认为默认情况下 .sort 比较字符串是状态仍然正确的原因,我的问题是我如何实现它以根据销售额进行比较?

最佳答案

在您的问题陈述中,您说的是“比较基于状态升序和销售降序”。基于此,您的结果是有效的。各州按升序排列,每个州的销售额按降序排列。在接下来的声明中,您要说的是(特定统计数据的较低销售额应该放在第一位)。所以基本上你有两个相互矛盾的要求。两者不能同时进行。

换句话说,您是否希望您的程序执行其他操作,例如两者都应该升序或降序或其他顺序。如果是,那么您必须相应地修改您的 compareTo 方法。

关于java - 使用 compareTo 和 Collections.sort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18754490/

相关文章:

java - 有序集合和排序集合有什么区别?

mongodb - 在 Mongo C-Driver 中按子字段排序

php - 对数组进行排序并显示其对应者

java - 从不同线程调用时查询超时

java - Android 上 SoundPool 的奇怪错误

ruby - 按日期排序的更好方法是什么?

java - 如何在 anyMatch() java 8 流中应用复合 BiPredicate

java - 在 ArrayList Java 中查找元素

java - Excel无法理解java写入的数据格式

java - 将 rgbMap 映射到深度Map