Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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 使用compareTo和Collections.sort_Java_Sorting_Collections_Comparable - Fatal编程技术网

Java 使用compareTo和Collections.sort

Java 使用compareTo和Collections.sort,java,sorting,collections,comparable,Java,Sorting,Collections,Comparable,我有一个特许经营类,有owner(特许经营权所有者的名称)、state(特许经营所在州的两个字符串)和sales(当天的总销售额) 公共类特许经营实施可比性{ 最终字符串所有者; 最终字符串状态; 最终双倍销售; 受保护的特许经营权(字符串所有者、字符串状态、双重销售){ this.owner=所有者; this.state=状态; 这个。销售=销售; } 公共字符串toString(){ 字符串str=state+“,“+sales+”,“+owner; 返回str; } 公共字符串getSt

我有一个特许经营类,有owner(特许经营权所有者的名称)、state(特许经营所在州的两个字符串)和sales(当天的总销售额)

公共类特许经营实施可比性{
最终字符串所有者;
最终字符串状态;
最终双倍销售;
受保护的特许经营权(字符串所有者、字符串状态、双重销售){
this.owner=所有者;
this.state=状态;
这个。销售=销售;
}
公共字符串toString(){
字符串str=state+“,“+sales+”,“+owner;
返回str;
}
公共字符串getState(){
返回状态;
}
公开销售(){
退货;
}
公共国际比较(特许经营权){
double that sales=that.getSales();
如果(this.getState().compareTo(that.getState())<0)
返回-1;
else if(this.getSales()>thatSales)
返回-1;
else if(this.getSales()
比较基于状态升序和销售降序

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

}
import java.util.ArrayList;
导入java.util.Collections;
公共类测试仪{
公共静态void main(字符串[]args){
ArrayList特许权=新的ArrayList();
特许经营权a=新特许经营权(“安德鲁·勒克”,“IN”,1270.5);
特许经营权b=新特许经营权(“雷·赖斯”,“马里兰州”,1210);
特许经营权c=新特许经营权(“阿尔弗雷德·莫里斯”,“华盛顿州”,980.5);
特许经营权d=新特许经营权(“Roddy White”,“GA”,670);
特许经营权e=新特许经营权(“格雷格·奥尔森”,“SC”,740);
特许经营权f=新特许经营权(“T.Y.希尔顿”,“IN”,950);
特许经营权g=新特许经营权(“朱利奥·琼斯”,“GA”,560);
加入(a);
加入(b);
加入(c);
加入(d);
加入(e);
加入(f);
加入(g);
收集、分类(特许经营);
对于(inti=0;i
当我比较这些没有
集合.sort
的特许经营对象时,它们的比较是正确的,但是当我使用
集合.sort
进行测试时,我得到如下输出:

GA,670.0,Roddy White
佐治亚州,560.0,朱利奥·琼斯
年,1270.5,安德鲁·勒克
年,950.0,T.Y.希尔顿
MD,1210.0,雷·赖斯
SC,740.0,格雷格·奥尔森
华盛顿州,980.5,阿尔弗雷德·莫里斯

该州的数据仍在正确比较中,但没有按销售额进行适当比较(特定数据的较低销售额应排在第一位)


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

您必须将
比较修改为
方法。因为您在比较状态后返回。所以你必须比较各州的情况,还要比较销售额

例如:

public int compareTo(Franchise that) {
    int stateComparition = this.getState().compareTo(that.getState()); 
    Double sales = Double.valueOf(this.getSales());    
    Double thatSales = Double.valueOf(that.getSales());
    int salesComparition = sales.compareTo(thatSales);    

    if(stateComparition == 0){
        if(salesComparition > 0)
             return -1;
        else if(salesComparition < 0)
             return 1;
        else
             return 0;
    }
       return stateComparition;         
}
public int compareTo(特许经营权){
int stateComparition=this.getState().compareTo(that.getState());
Double sales=Double.valueOf(this.getSales());
Double thatSales=Double.valueOf(that.getSales());
int-salesComparition=sales.compareTo(thatSales);
如果(状态比较==0){
如果(salesComparition>0)
返回-1;
else if(salesComparition<0)
返回1;
其他的
返回0;
}
返回状态比较;
}

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


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

这是因为在第一次比较条件时,您是根据状态进行比较的。如果当前对象的状态不小,则只会进行基于销售额的比较。根据您的代码,在状态中,您希望当前对象的状态小于比较状态,但是在销售比较中,您希望当前对象的销售大于比较对象。这就是为什么你会得到不同的结果。各州按升序进行比较,销售额按降序进行比较。这完全取决于您从compareTo函数返回的内容

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;
}
public int compareTo(特许经营权){
double that sales=that.getSales();
如果(this.getState().compareTo(that.getState())<0)
返回-1;
else if(this.getSales()thatSales)
返回1;
其他的
返回0;
}

希望这段代码能帮助你。你可以在

Compariable上找到很好的解释,它只能给出一种比较方法。这可以使用比较器接口来完成

Collections.sort(list, new Comparator<Franchise>() {
@Override
            public int compare(Franchise obj1, Franchise obj2) {
                if(obj1.getState().compareTo(obj2.getState()) == 0)
                {
                    Double a1 =obj1.getSales();
                    Double a2 = obj2.getSales();
                    return a2.compareTo(a1);
                }

                    return o1.getName().compareTo(o2.getName());
        } 
}
Collections.sort(列表,新比较器(){
@凌驾
公共整数比较(特许经营obj1、特许经营obj2){
如果(obj1.getState().compareTo(obj2.getState())==0)
{
双a1=obj1.getSales();
Double a2=obj2.getSales();
返回a2。比较(a1);
}
返回o1.getName().compareTo(o2.getName());
} 
}

@user2745043此处您使用的是字符串比较,如果字符串比较为0,则与销售人员进行比较,您有什么问题?@user2745043是否希望先按销售人员下单,然后再按状态下单?
Collections.sort(list, new Comparator<Franchise>() {
@Override
            public int compare(Franchise obj1, Franchise obj2) {
                if(obj1.getState().compareTo(obj2.getState()) == 0)
                {
                    Double a1 =obj1.getSales();
                    Double a2 = obj2.getSales();
                    return a2.compareTo(a1);
                }

                    return o1.getName().compareTo(o2.getName());
        } 
}