2017-03-24 13 views
-1

UnoPlayerメソッドの正当性をテストするためにすでに書き出されているmainメソッドのUnoPlayer.javaコードを書いています。リスト内の特定のデータタイプの金額を確認する方法は?

私は、手の中のある色(データ型)の量が他の色の量よりも大きいかどうかを確認しようとしています。

手はリストタイプです!

だから、Color.BLUEのために、私はこれを持っている:

if (hand.contains(Color.BLUE > Color.RED && Color.GREEN && Color.YELLOW)) { 
    colorReturned = Color.BLUE; 
} 

私は、彼らがint型ではないので、私の色データ型はバイナリのオペランドでは動作しませんので、これは動作しないことを知っています。それが言うように、私はそれをコーディングする方法を

{

//がColor.BLUEを返す}ここ

がカードである(手が色の残りの部分よりも多くのColor.BLUEが含まれている)//場合

実装:

private UnoPlayer.Color color; 
private UnoPlayer.Rank rank; 
private int number; 

public Card(UnoPlayer.Color color, UnoPlayer.Rank rank) { 
    this.color = color; 
    this.rank = rank; 
    this.number = -1; 
} 


public Card(UnoPlayer.Color color, int number) { 
    this.color = color; 
    this.rank = UnoPlayer.Rank.NUMBER; 
    this.number = number; 
} 


public Card(UnoPlayer.Color color, UnoPlayer.Rank rank, int number) { 
    this.color = color; 
    this.rank = rank; 
    this.number = number; 
} 
+2

どのようなタイプの変数が「手」ですか? –

+0

@ChrisGongの手がリストです!申し訳ありません。 – hattic

+0

'int'または' Integer'のリスト? –

答えて

0

問題は、Java docsによると、正しくブール変数(値がリストに存在するかどうかに応じてtrueまたはfalse)を返すcontains方法をcontainsを使用していないということです。しかし、containsObjectをパラメータとするブール式を入力しています。

特定のデータ型はリストの中で最も発生したかどうかをチェックする私の提案、私が最初にそうような最高に発生するデータの種類の数を維持し、リストを並べ替えるだろう、

Collections.sort(hand); 
int prev = hand.get(0); 
int occursMost = hand.get(0); 
int count = 1; 
int maxCount = 1; 

for (int i = 1; i < hand.length; i++) { 
    if (a.get(i) == prev) 
     count++; 
    else { 
     if (count > maxCount) { 
      popular = a.get(i-1); 
      maxCount = count; 
     } 
     prev = hand.get(i); 
     count = 1; 
    } 
} 
if(occursMost == Color.BLUE) { 
    colorReturned = Color.BLUE; 
} 

少し方法これは、それでは、私は色の背後にあるint型の値についてはかなりよく分からないが、あなたの手は、この

GREEN, BLUE, RED, GREEN, BLUE, BLUE 

のように見えるとしましょう作品ソート後、可能性は次のようになり、手、

GREEN, GREEN, RED, BLUE, BLUE, BLUE 

ループは緑色で開始し、別の色が見つかるまでcountをインクリメントし続けます。いったん別の色が見つかると、countmaxCountでチェックされ、これまでに最も人気のある色が見つかっているかどうかが確認されます。その後、countをリセットし、リスト内の次の色の出現数のカウントを開始します。ループの最後に、リスト内で最も一般的な色を設定する必要があります。

+0

私はそれを理解していますが、私はmaxCount、Collections、またはpopularを一度も使用していないので、私は200コースにしか入っていません。また、手はデータ型のカードでいっぱいですので、コードの先頭でそれらの初期化を使ってint型に変換することはできません。私はカードのデータ型の実装を投稿します – hattic

+0

@hattic私の謝罪は非アクティブであるため、私はちょうど戻ってきました。上記のコードを 'Card'クラスに合わせて修正するのを手伝ってくれるので、あなたの問題を解決できたか、まだ助けが必要であることを確認したかっただけです。 –

0

と仮定すると手が、あなたはおそらく、それぞれの色が持つ回数を追跡する、ループを書きたい各カード(宇野のゲームのように)色を持っているカードのリストです来る。その後、最大カウントを持つものを返します。

のJava 8で
List<Card> hand; 
Map<Color, Integer> colorCount = new HashMap<>(); 
for (Card card : hand) { 
    int currentCount = colorCount.get(card.getColor()) == null ? 0 : colorCount.get(card.getColor()); 
    colorCount.put(card.getColor(), currentCount + 1); 
} 

List<Card> hand; 
Map<Color, Integer> colorCount = new HashMap<>(); 
list.forEach(card -> colorCount.put(card.getColor(), 1 + colorCount.getOrDefault(card.getColor(), 0))); 

、マップから最大数と色を取得するには、このSO answerを参照してください。

+0

これは私がそこに持っているコードでしようとしたものですが、バイナリ演算子 '>'に対してエラーの悪いオペランドタイプがあります。私は正しい構文を知っていない私のデッキにいくつのブルースの特定のint値を確認する。 ハンドクラスはすでに与えられた.javaの一部です。私は自分のプレーヤーメソッドを作成しています – hattic

+0

カウントを得るために追加されたコードを参照してください。 'contains'を使うのがなぜ間違っているのかについてのChrisの答えも見てください。 – digvijay91

関連する問題