Перестановка массива объектов в Java не работает должным образом - PullRequest
0 голосов
/ 29 августа 2018

Я создал массив объектов карты, которые я хочу перемешать. Тем не менее, когда я использую простой метод перемешивания, вывод неправильный. Вместо перетасовки он дублирует некоторые карты и удаляет другие. Вот пример того, что он печатает

Jack of Clubs
5 of Hearts
4 of Hearts
7 of Hearts
5 of Hearts
Ace of Spades
8 of Clubs
5 of Hearts
Jack of Diamonds
Jack of Clubs
Queen of Diamonds
Jack of Diamonds
9 of Diamonds
4 of Hearts
Jack of Diamonds
3 of Diamonds
6 of Diamonds
Jack of Clubs
4 of Hearts
10 of Diamonds
Jack of Diamonds
2 of Diamonds
Queen of Diamonds
7 of Hearts
5 of Hearts
King of Diamonds
5 of Hearts
9 of Diamonds
Ace of Spades
4 of Diamonds
King of Diamonds
10 of Hearts
9 of Diamonds
2 of Diamonds
10 of Diamonds
5 of Hearts
10 of Diamonds
Queen of Diamonds
Queen of Diamonds
Queen of Diamonds
4 of Diamonds
2 of Diamonds
9 of Diamonds
Queen of Diamonds
10 of Diamonds
7 of Hearts
5 of Hearts
8 of Clubs
4 of Hearts
5 of Hearts
5 of Hearts
5 of Hearts

Как вы видите, здесь слишком много бриллиантов и почти нет треф или пик. Я также заметил, что только костюмы испорчены. Есть четыре из каждого числа и четыре джека, королевы, короли и тузы. Спасибо за вашу помощь.

Вот код класса карты:

public class Card {
//variables for attributes
private String name;
private String suit;
private int value;

//constructors
public Card(){
}
public Card(String name, String suit, int value){
    this.setSuit(suit);
    this.setValue(value);
    this.setName(name);
}

//getter and setter methods
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getSuit() {
    return suit;
}
public void setSuit(String suit) {
    this.suit = suit;
}
public int getValue() {
    return value;
}
public void setValue(int value) {
    this.value = value;
}
}

А вот код класса колоды:

public class Deck {
//array of cards
private Card[] cardArray = new Card[52];

//constructor
public Deck(){
}

//methods to create cards of different suits
public void createClubs(){
    for(int i = 0; i < 9; i++){
        cardArray[i]=new Card(Integer.toString(i+2),"Clubs",i+2);
    }
    cardArray[9]=new Card("Jack","Clubs",10);
    cardArray[10]=new Card("Queen","Clubs",10);
    cardArray[11]=new Card("King","Clubs",10);
    cardArray[12]=new Card("Ace","Clubs",1);
}
public void createDiamonds(){
    int j = 2;
    for(int i = 13; i < 22; i++){
        cardArray[i]=new Card(Integer.toString(j),"Diamonds",j);
        j++;
    }
    cardArray[22]=new Card("Jack","Diamonds",10);
    cardArray[23]=new Card("Queen","Diamonds",10);
    cardArray[24]=new Card("King","Diamonds",10);
    cardArray[25]=new Card("Ace","Diamonds",1);
}
public void createHearts(){
    int k = 2;
    for(int i = 26; i < 35; i++){
        cardArray[i]=new Card(Integer.toString(k),"Hearts",k);
        k++;
    }
    cardArray[35]=new Card("Jack","Diamonds",10);
    cardArray[36]=new Card("Queen","Diamonds",10);
    cardArray[37]=new Card("King","Diamonds",10);
    cardArray[38]=new Card("Ace","Hearts",1);
}
public void createSpades(){
    int l = 2;
    for(int i = 39; i < 48; i++){
        cardArray[i]=new Card(Integer.toString(l),"Diamonds",l);
        l++;
    }
    cardArray[48]=new Card("Jack","Diamonds",10);
    cardArray[49]=new Card("Queen","Diamonds",10);
    cardArray[50]=new Card("King","Diamonds",10);
    cardArray[51]=new Card("Ace","Spades",1);
}

//method to get and display attributes of the array
public void displayArray(){
    for(int i = 0; i<cardArray.length;i++){
        System.out.println(cardArray[i].getName() + " of " + cardArray[i].getSuit());
    }
}
public void displayCard(int i){
    System.out.println(cardArray[i].getName() + " of " + cardArray[i].getSuit());
}
public Card[] getArray(){
    return cardArray;
}

//shuffle method
public void shuffle(){
    for(int i = 0; i<cardArray.length; i++){
        int random = (int)(Math.random() * cardArray.length);

        Card temp = cardArray[random];
        cardArray[random] = cardArray[i];
        cardArray[i] = temp;
    }
}
}

1 Ответ

0 голосов
/ 30 августа 2018

Это не имеет ничего общего с вашим shuffle методом.

public void createSpades(){
    int l = 2;
    for(int i = 39; i < 48; i++){
        cardArray[i]=new Card(Integer.toString(l),"Diamonds",l);
        l++;
    }
    cardArray[48]=new Card("Jack","Diamonds",10);
    cardArray[49]=new Card("Queen","Diamonds",10);
    cardArray[50]=new Card("King","Diamonds",10);
    cardArray[51]=new Card("Ace","Spades",1);
}

Метод создания пиков определяет костюм как алмазов . createHearts содержит аналогичные опечатки.

Нет смысла в том, чтобы четыре метода делали одно и то же. Помимо того, что вы слишком многословны, вы делаете ошибки при копировании и вставке.

Вы можете написать один метод для создания костюма:

public void createSuit(int offset, String name){
    for(int i = 2; i <= 10; i++){
        cardArray[offset + i - 2]=new Card(Integer.toString(i),name,i);
    }
    cardArray[offset + 9]=new Card("Jack",name,10);
    cardArray[offset + 10]=new Card("Queen",name,10);
    cardArray[offset + 11]=new Card("King",name,10);
    cardArray[offset + 12]=new Card("Ace", name,1);
}

Теперь просто вызовите для каждой масти, передав соответствующее имя и смещение: если он работает для одной масти, он работает для них всех.

createSuit(0, "Clubs");
createSuit(13, "Diamonds");
createSuit(26, "Hearts");
createSuit(39, "Spades");

С точки зрения метода shuffle, он неправильно реализован для обеспечения справедливого распределения. Более простой подход - использовать Collections.shuffle:

Collections.shuffle(Arrays.asList(cardArray));
...