3

所有者 (フランチャイズの名前の所有者)、州 (フランチャイズがある州の 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 は州の昇順と売上の降順に基づいています

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、TY Hilton
MD、1210.0、Ray Rice
SC、740.0、Greg Olsen
WA、980.5、Alfred Morris

州はまだ正しく比較されていますが、売上で適切に比較されていません (特定の統計の低い売上が最初に来るはずです)。

.sort がデフォルトで文字列を比較するのは、状態がまだ正しい理由だと思います。私の質問は、販売に基づいて比較するためにどのように実装するのですか?

4

4 に答える 4

2

問題の説明では、 「compareTo は州の昇順と売上の降順に基づいている」と言っています。これに基づいて、結果は有効です。州は昇順で、各州の売上は降順です。あなたが言っている次のステートメントで(特定の統計の低い売上が最初に来るべきです) . したがって、基本的には、2 つの相反する要件があります。両方を同時に行うことはできません。

言い換えれば、あなたのプログラムは、昇順、降順、またはその他の順序である必要があります。はいの場合は、compareTo メソッドを適宜変更する必要があります。

于 2013-09-12T03:33:20.410 に答える
1

メソッドを変更する必要がありますcompareTo。状態を比較してから戻ってくるからです。したがって、状態だけでなく販売も比較する必要があります。

例えば:

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;         
}
于 2013-09-12T02:55:43.603 に答える
0

それはまず比較条件を状態に基づいて比較しているからです。現在のオブジェクトの状態が小さくない場合は、売上に基づく比較のみが行われます。あなたのコードによれば、状態では現在のオブジェクトの状態を比較状態よりも小さくしたいのですが、売上比較では現在のオブジェクトの売上を比較オブジェクトよりも大きくしたいと考えています。これが、異なる結果が得られる理由です。州は昇順で比較され、売上は降順で比較されます。それはすべて、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;
}

このコードがお役に立てば幸いです。ここで良い説明を見つけることができます

于 2016-10-23T10:30:07.113 に答える
0

Comparable は、1 つの比較方法のみを提供します。これは、Comparator インターフェイスを使用して行うこともできます。

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 obj1.getName().compareTo(obj2.getName());
    } 
}
于 2018-04-13T18:13:32.480 に答える