Comparator インターフェイスを適切に使用する方法がわかりません。
注:ほとんどのコードで見られる「1行」のコンパレータ実装は使用したくありません。つまり、次のことを意味します。
Collections.sort(deck, new Comparator<Card>() {
@Override
public int compare(Card o1, Card o2) {
return WHATEVER;
});
繰り返しますが、これを使用したくありません。なぜなら、多くの異なる ArrayList をソートすることになり、毎回それを行うのはスペースの無駄に思えるからです。私のcompareToメソッドを1か所に一度書いて、どうにかしてそれを機能させたいと思っています。
さまざまなことを試しましたが、インターフェイスの実装は初めてなので、おそらく何かが欠けています。
これは、compare メソッドを使用した私の Card クラスです。(注: 時間を節約するために、列挙型を使用してコードと比較を単純化することに興味はありません。Comparator を適切に使用する方法を学びたいだけです。見た目が悪いことはわかっていますが、いくつか使用する必要があります。すでに書かれたコードです。)
import java.util.*;
public class Card implements Comparator<Card>
{
private String number;
private int value;
private int finalValue;
private String suit;
private Player owner;
public Card(String number, String suit)
{
this.number=number;
switch (number){
case "2": this.value = 2;
break;
case "3": this.value = 3;
break;
case "4": this.value = 4;
break;
case "5": this.value = 5;
break;
case "6": this.value = 6;
break;
case "7": this.value = 7;
break;
case "8": this.value = 8;
break;
case "9": this.value = 9;
break;
case "10": this.value = 10;
break;
case "J": this.value = 11;
break;
case "Q": this.value = 12;
break;
case "K": this.value = 13;
break;
case "A": this.value = 14;
break;
}
this.suit=suit;
switch (suit){
case "Spades": this.finalValue = this.value*4;
break;
case "Hearts": this.finalValue = this.value*5;
break;
case "Clubs": this.finalValue = this.value*2;
break;
case "Diamonds": this.finalValue = this.value*3;
break;
}
}
public int compare(Card card1, Card card2)
{
Integer suitValue1;
if (card1.getSuit() == "Hearts")
suitValue1=5;
else if (card1.getSuit() == "Spades")
suitValue1=4;
else if (card1.getSuit() == "Diamonds")
suitValue1=3;
else
suitValue1=2;
Integer suitValue2;
if (card2.getSuit() == "Hearts")
suitValue2=5;
else if (card2.getSuit() == "Spades")
suitValue2=4;
else if (card2.getSuit() == "Diamonds")
suitValue2=3;
else
suitValue2=2;
Integer value1, value2;
value1 = card1.getValue();
value2 = card2.getValue();
if (suitValue1 != suitValue2)
return suitValue1.compareTo(suitValue2);
else
return value1.compareTo(value2);
}
//get methods
public int getValue()
{return this.value;}
public int getFinalValue()
{return this.finalValue;}
public String getNumber()
{return this.number;}
public String getSuit()
{return this.suit;}
public Player getOwner()
{return this.owner;}
//set methods
public void setValue(int value)
{this.value = value;}
public void setFinalValue(int finalValue)
{this.finalValue = finalValue;}
public void setNumber(String number)
{this.number = number;}
public void setSuit(String suit)
{this.suit = suit;}
public void setOwner(Player player)
{this.owner = player;}
}
それが私の比較方法です。別のクラスか何かに入れるべきですか?私はこれを使ってそれを呼び出そうとします:
Collections.sort(deck, new Comparator<Card>());
しかし、それは明らかに間違っています。
Deck は ArrayList です:private ArrayList<Card> deck = new ArrayList<Card>();
さまざまな Card オブジェクトで満たされています。