/ / Пренебрегване на дублирани в масив от класа в Java - Java, масиви, дубликати, дубликат за премахване

Пренебрегване на дублирани в масив от клас в Java - Java, масиви, дубликати, дубликат за премахване

Контекст: Опитвам се да направя покер програма, която дава 5 карти от палубата на карти. Имам конструктор, който дава произволни карти и масив в за цикъл, който призовава конструктора да даде на потребителя 5 карти. Все пак не знам как да го настроя, така че двете карти да нямат същата стойност && костюм. Досега аз се опитах да направя една do / while loop в for loop без никаква полза. Това е част от проекта:

Основният клас

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



}

}

и класа, който съдържа конструктора

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

}

Отговори:

1 за отговор № 1

Ето някои идеи за внедряване на палубата с карти.

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 за отговор № 2

Има няколко начина, които можете да приложитедублирането на проверката, но може би най-чистият начин да го направите е да се възползвате от факта, че Sets не може да съдържа дубликати. Така че първо, преименувайте hashCode () и се равнява на () във вашия покер клас (можете да видите как това може да се направи, например, в този въпрос). След това в основния си метод поставете картите в комплект вместо масив:

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

Има недостатък в това, което е товатехнически ви оставя отворена за възможността за безкраен цикъл, ако покер конструкторът продължава да връща елементи, които вече са в комплекта. Разбира се, на практика това никога няма да се случи, докато вашият покер конструктор правилно връща произволни комбинации. Основният проблем е, че е невъзможно да се разбере какво вече е в ръката на играча, когато създавате нов играчХанд обект.