洗牌 java 中的对象数组无法正常工作
Shuffling an array of objects in java not working properly
我创建了一组要洗牌的卡片对象。但是,当我使用简单的随机播放方法时,输出不正确。它不是洗牌,而是复制一些牌并删除其他牌。这是它打印的内容的示例
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
如您所见,方块太多,几乎没有梅花或黑桃。我还注意到只有西装弄乱了。每个数字中有四个和四个 Jack Queens Kings 和 Ace。感谢您的帮助。
这是卡的代码 class:
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;
}
}
这里是套牌的代码 class:
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;
}
}
}
这与您的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));
我创建了一组要洗牌的卡片对象。但是,当我使用简单的随机播放方法时,输出不正确。它不是洗牌,而是复制一些牌并删除其他牌。这是它打印的内容的示例
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
如您所见,方块太多,几乎没有梅花或黑桃。我还注意到只有西装弄乱了。每个数字中有四个和四个 Jack Queens Kings 和 Ace。感谢您的帮助。
这是卡的代码 class:
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;
}
}
这里是套牌的代码 class:
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;
}
}
}
这与您的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));