/ / Duplizieren von Duplikaten in einem Array einer Klasse in Java - Java, Arrays, Duplikate, Duplikat-Entfernen

Ignorieren von Duplikaten in einem Array einer Klasse in Java - Java, Arrays, Duplikate, Duplikat-Entfernung

Kontext: Ich versuche, ein Poker-Programm zu machen, das 5 Karten aus einem Kartenspiel gibt. Ich habe einen Konstruktor, der zufällige Karten und ein Array in einer for-Schleife gibt, die den Konstruktor aufruft, um dem Benutzer 5 Karten zu geben. Ich weiß jedoch nicht, wie ich es einrichten soll, damit zwei Karten nicht den gleichen Wert && passen. Bis jetzt habe ich versucht, eine do / while-Schleife in die for-Schleife zu setzen, ohne Erfolg. Dies ist Teil des Projekts:

Die Hauptklasse

public class pokerMain {

public static void main(String[] args) {

Scanner key = new Scanner(System.in);

pokerHand[] card = new pokerHand[5];

System.out.println("Would you like 5 random cards?");

if(key.next().equals("yes"))
{
for(int i = 0; i < 5; i++)
{
card[i] = new pokerHand();
System.out.println(card[i]);
}
}



}

}

und die Klasse, die den Konstruktor enthält

public class pokerHand {

private int value;
private String suit;

//gives a random card
public pokerHand()
{
Random card = new Random();
value = card.nextInt(13) + 1;
int suitNb = card.nextInt(4) + 1;

switch(suitNb)
{
case 1: suit = "hearts"; break;
case 2: suit = "spades"; break;
case 3: suit = "diamonds"; break;
case 4: suit = "clubs"; break;
}

}

Antworten:

1 für die Antwort № 1

Hier sind einige Ideen, um das Kartenspiel zu implementieren.

public enum Suite {
HEARTS, SPADES, CLUBS, DIAMONDS;
}

public enum Value {
ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE;
}

public class Card
{
private final Suite suite;
private final Value value;

public Card(final Suite suite, final Value value)
{
this.suite = suite;
this.value = value;
}

@Override
public boolean equals(final Object obj)
{
if (this == obj)
{
return true;
}
if (obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
final Card other = (Card) obj;
if (suite != other.suite)
{
return false;
}
if (value != other.value)
{
return false;
}
return true;
}

@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + ((suite == null) ? 0 : suite.hashCode());
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}

@Override
public String toString()
{
return "[" + value + " of " + suite + "]";
}
}

public class Deck
{
public static void main(final String[] args)
{
final Deck deck = new Deck();
for (int i = 0; i < 5; i++)
{
System.out.println(deck.deal());
}
}

List<Card> cards = new ArrayList<Card>();

public Deck()
{
// initialise
for (final Suite suite : Suite.values())
{
for (final Value value : Value.values())
{
final Card card = new Card(suite, value);
cards.add(card);
}
}
}

public Card deal()
{
final Random random = new Random(System.nanoTime());
if (cards.size() > 0)
{
return cards.remove(random.nextInt(cards.size()));
}
else
{
return null;
}
}

@Override
public String toString()
{
return cards.toString();
}
}

0 für die Antwort № 2

Es gibt einige Möglichkeiten, die Sie implementieren könntenDuplikatprüfung, aber wahrscheinlich die sauberste Art, dies zu tun, ist die Tatsache, dass Sets keine Duplikate enthalten können. Überschreibe also zuerst hashCode () und equals () in deiner pokerHand-Klasse (du kannst sehen, wie das zum Beispiel in diese Frage). Fügen Sie dann in Ihrer Hauptmethode die Karten in ein Set statt in ein Array ein:

if(key.next().equals("yes"))
{
Set<pokerHand> hands = new HashSet<pokerHands>();
while (hands.size() < 5) {
hands.add(new pokerHand());
}

for (pokerHand hand : hands) {
System.out.println(hand);
}
}

Es gibt einen Nachteil, der darin bestehttechnisch lässt Sie offen für die Möglichkeit einer Endlosschleife, wenn der PokerHand-Konstruktor Elemente, die bereits in der Menge sind, zurückgibt. In der Praxis würde das natürlich niemals passieren, solange dein PokerHand-Konstruktor zufällige Kombinationen korrekt zurückgibt. Das zugrunde liegende Problem ist, dass es unmöglich ist zu wissen, was bereits in der Hand des Spielers ist, wenn Sie ein neues playerHand-Objekt konstruieren.