/ / Ignorowanie duplikatów w tablicy klasy w Javie - java, tablice, duplikaty, duplikowanie-usuwanie

Ignorowanie duplikatów w tablicy klasy w Javie - java, tablice, duplikaty, duplikowanie-usuwanie

Kontekst: Próbuję stworzyć program pokerowy, który daje 5 kart z talii kart. Mam konstruktora, który daje losowe karty i tablicę w pętli for, która wywołuje konstruktora, aby dać użytkownikowi 5 kart. Jednak nie wiem jak to ustawić, aby dwie karty nie miały tej samej wartości i koloru. Do tej pory próbowałem umieścić pętlę do / while w pętli for bezskutecznie. To część projektu:

Główna klasa

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



}

}

i klasa zawierająca konstruktor

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

}

Odpowiedzi:

1 dla odpowiedzi № 1

Oto kilka pomysłów na wdrożenie talii kart.

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 dla odpowiedzi nr 2

Istnieje kilka sposobów, które możesz wdrożyćduplikowanie sprawdzania, ale prawdopodobnie najczystszym sposobem na to jest wykorzystanie faktu, że zestawy nie mogą zawierać duplikatów. Najpierw przesłoń hashCode () i equals () w klasie pokerHand (możesz zobaczyć, jak można to zrobić, na przykład to pytanie). Następnie w swojej głównej metodzie, umieść karty w Zestawie zamiast tablicy:

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

Jest w tym wada, która polega na tymtechnicznie pozostawia otwartą na możliwość nieskończonej pętli, jeśli konstruktor pokerHand nadal zwraca elementy, które są już w zestawie. Oczywiście w praktyce nigdy by się to nie wydarzyło, o ile Twój konstruktor pokerHand poprawnie zwróci losowe kombinacje. Podstawowym problemem jest to, że nie można wiedzieć, co jest już w dłoni gracza, gdy konstruujesz nowy obiekt playerHand.