2017-09-30 8 views
1

java.io.Serializableインターフェイスを実装し、radiusに基づいて円をモデル化する "Circle"という名前のJavaクラスを作成します。半径はゼロより小さくすることはできません。 radiusのgetterメソッドとsetterメソッドを実装します。サークルクラスにtoStringのオーバーライドも含めます。サークル型の2つのオブジェクトを比較するクラスのコンパレータを作成します。円の2つのオブジェクトを比較する

これは私が持っているもので、これまで

import java.io.Serializable; 


public class Circle implements Serializable, Comparable<Circle> { 

private int radius = 1; 

public Circle() { 
} 


public Circle(int radius) { 
    setRadius(radius); 

} 

public void setRadius(int v) { 
    if (v > 0) { 
     this.radius = v; 
    } 

} 

public int getRadius() { 
    return this.radius; 

} 



@Override 
public String toString() { 
    return "Circle{" + "radius=" + radius + '}'; 
} 

@Override 
public int compareTo(Circle o) { 
    //no idea what to put here 

} 



} 

これは私のコンパレータクラス

import java.util.Comparator; 

public class CompareCircle implements Comparator<Circle> { 

CompareCircle(Circle c1, Circle c2) { 

} 

@Override 
public int compare(Circle o1, Circle o2) { 
    if (o1.getRadius() > o2.getRadius()) { 
     return o1.getRadius(); 
    } else { 
     return o2.getRadius(); 
    } 

} 
} 

私はこの権利をしましたされて私の質問あるいは全く?

+0

いいえ、あなたはしませんでした。 Comparatorのjavadocを読んで、その理由とcompare()メソッドが返すべきものを理解してください。 Comparableを実装しないあなたはサークルを比較するためにコンパレータを使用していますか? –

+0

//ここに何を置くべきかわからない - 'return Integer.comapre(this.getRadius()、o.getRadius())' –

答えて

-1

JBが指摘したようにCircleクラスを使用すると、comperatorを使用している場合Comparableを実装する必要はありません。 :

public class Circle implements Serializable /*, Comparable<Circle> */{ 

CompareCircleでは、コンストラクタを削除できます(実際にはデフォルトのコンストラクタCompareCircle()を使用します)。
compare方法は、2つの等しい円のケースを処理する必要があります

@Override 
public int compare(Circle o1, Circle o2) { 
    //you may want to consider cases where one circle or both are null 
    if (o1.getRadius() > o2.getRadius()) { 
     return o1.getRadius(); 
    } else if (o1.getRadius() == o2.getRadius()) { 
     return 0; 
    }   
     return o2.getRadius(); 
    } 
} 
1

まず、Comparableを実装するか、compareTo()を上書きする必要はありません。 documentationによれば、これはcompare()が返すべきである

:最初の引数は、に等しく、以下秒より大きいよう

は負の整数、ゼロ、または正の整数を返します。

戻り値:あなたは、これらの要件を満たすためにInteger.compare()を使用することができます

のx == yの場合 値0を。 xが0の場合は0より小さい値。< y;そして、比較するためのx> yの

import java.util.Comparator; 

public class CompareCircle implements Comparator<Circle> { 
    @Override 
    public int compare(Circle o1, Circle o2) { 
     return Integer.compare(o1.getRadius(), o2.getRadius()); 
    } 
} 

場合は0より大きい値は、あなたがCompareCircleのインスタンスを作成する必要があります。

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

public class Main { 
    public static void main(String[] args){ 
     ArrayList<Circle> list = new ArrayList<Circle>() {{ 
      add(new Circle(4)); 
      add(new Circle(7)); 
      add(new Circle(2)); 
     }}; 

     CompareCircle comp = new CompareCircle(); 
     Circle c = Collections.max(list, comp); 

     System.out.println(c.getRadius()); 
    } 
} 

出力リレー:あなたは最大のオブジェクトを取得するためにCollections.max()でそれを使用することができます

+0

2つの整数の比較を実装するには、減算を使って宣伝しないでください。 Integer.compare()を使用します。非常に大きな値の整数オーバーフローのために減算が失敗します。 –

+0

2または3のサークルのうち最大のものを返す場合はどうすればよいですか? –

+0

@JohnCasey Collections.max()を使う - 私は自分の答えを更新しました。 @JBNizetこの場合、幾何学的に意味をなさないので、半径は決して負ではないと仮定します。したがって、オーバーフローは発生しません。しかし、それは良い習慣であり、コードを更新しました。 – Mark

関連する問題