2017-03-24 3 views
-1

Ich schreibe einen UnoPlayer.java-Code für eine Hauptmethode, die bereits ausgeschrieben wurde, um die Rechtmäßigkeit unserer UnoPlayer-Methode zu testen.Wie kann man nach einem bestimmten Datentyp in der Liste suchen?

Ich versuche zu überprüfen, ob die Menge einer Farbe (ein Datentyp) in meiner Hand größer als die Menge der anderen Farben ist.

Hand ist ein Listentyp !!

Also, für Color.BLUE, ich habe dies:

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

Ich weiß, dass dies nicht, weil meine Farbe Datentyp mit Binäroperanden funktioniert nicht funktioniert, weil sie nicht Ints sind. Wie würde ich es Code, so dass es sagt

// if (Hand mehr Color.BLUE als der Rest der Farben enthält) {

// Gibt Color.BLUE}

hier ist die Karte Umsetzung:

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

Welche Art von Variable ist 'Hand'? –

+0

@ChrisGong Hand ist eine Liste!Entschuldigung für keine Angabe – hattic

+0

Eine Liste von 'int' oder' Integer'? –

Antwort

0

Das Problem ist, dass Sie nicht richtig contains verwendet, gemäß Java docs, die Methode contains eine boolean Variable gibt (true oder false in Abhängigkeit davon, ob ein Wert in der Liste vorhanden ist). Sie geben jedoch einen booleschen Ausdruck ein, wenn contains einen Object als Parameter verwendet.

Mein Vorschlag, wenn ein bestimmte Datentyp Überprüfung des meisten in einer Liste auftritt, würde ich zuerst die Liste sortieren, dann halte Zählung des höchsten Datentypen auftritt wie so,

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; 
} 

Ein wenig wie dies funktioniert, also lassen Sie uns sagen, dass Ihre Hand wie dieses ich bin

GREEN, BLUE, RED, GREEN, BLUE, BLUE 

schaut über die int-Werte hinter den Farben nicht ganz sicher, aber nach dem Sortieren der Hand könnte wie folgt aussieht,

GREEN, GREEN, RED, BLUE, BLUE, BLUE 

Die Schleife beginnt bei grün und erhöht dann weiter count, bis eine andere Farbe gefunden wird. Sobald eine andere Farbe gefunden wurde, wird count mit maxCount überprüft, um zu sehen, ob die bisher beliebteste Farbe gefunden wurde. Dann setzt es count zurück und beginnt mit dem Zählen der Vorkommen der nächsten Farbe in der Liste. Am Ende der Schleife sollte die beliebteste Farbe in der Liste eingestellt werden.

+0

ich verstehe das, aber ich bin nur in einem 200 Kurs, also haben wir nie verwendet, MaxCount, Sammlungen oder beliebt. Außerdem ist die Hand voll mit dem Datentyp Card, so dass es besagt, dass es nicht in ein int mit diesen Initialisierungen am Anfang des Codes konvertiert werden kann. Ich werde die Implementierung für den Kartendatensatz – hattic

+0

posten @hattic meine Entschuldigung dafür, inaktiv zu sein, bin ich gerade zurück. Ich wollte nur bestätigen, dass Sie Ihr Problem lösen konnten, oder Sie benötigen weiterhin Hilfe, da ich Ihnen helfen kann, den obigen Code so zu modifizieren, dass er in Ihre Klasse "Card" passt. –

0

Unter der Annahme Hand ist eine Liste von Karten, wobei jede Karte eine Farbe (wie im Spiel der Uno) hat, werden Sie wahrscheinlich eine Schleife, die Verfolgung der Anzahl, wie oft jede Farbe hat schreiben wollen Kommen Sie. Sie geben dann das mit der maximalen Anzahl zurück.

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); 
} 

In Java 8:

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

Und sehen diese SO answer die Farbe mit max Zählung von der Karte zu bekommen.

+0

Das ist, was ich mit dem Code, den ich dort oben getan habe, zu tun, aber ich habe den Fehler schlechte Operandentypen für binäre Operator '>'. Ich kenne nicht die richtige Syntax, um nach einem bestimmten int-Wert zu suchen, wie viele Blues in meinem Deck sind. die Handklasse ist bereits ein Teil der angegebenen .java, ich mache nur meine eigene Spielermethode – hattic

+0

Siehe den Code für die Zählung. Siehe auch die Antwort von Chris, warum die Verwendung von 'contains' falsch ist. – digvijay91

Verwandte Themen