Java 使用compareTo和Collections.sort
我有一个特许经营类,有owner(特许经营权所有者的名称)、state(特许经营所在州的两个字符串)和sales(当天的总销售额)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
公共类特许经营实施可比性{
最终字符串所有者;
最终字符串状态;
最终双倍销售;
受保护的特许经营权(字符串所有者、字符串状态、双重销售){
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());
}
}