Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA从数组更改为列表并使用shuffle方法_Java_Arrays_List_Methods_Collections - Fatal编程技术网

JAVA从数组更改为列表并使用shuffle方法

JAVA从数组更改为列表并使用shuffle方法,java,arrays,list,methods,collections,Java,Arrays,List,Methods,Collections,我的任务是创建一副牌,然后随机发五张牌。我终于让它“工作”,但我需要一些帮助。我刚刚读到java现在有了一个shuffle方法来洗牌列表。我们现在在数组上,所以我想我们需要数组。有没有一种方法可以对数组使用shuffle方法?如果没有,有人能指导我切换到列表吗?我想这将有助于回答我的下一个问题。我唯一要做的就是在5张随机牌发完后,说明牌组中还有多少张牌。但是,看看我是如何使用阵列的,你不能从阵列中移除物品,因为它是固定的(对吗?),我想看看是否有一种方法可以模拟从阵列中移除卡片,这样它们就不会再

我的任务是创建一副牌,然后随机发五张牌。我终于让它“工作”,但我需要一些帮助。我刚刚读到java现在有了一个shuffle方法来洗牌列表。我们现在在数组上,所以我想我们需要数组。有没有一种方法可以对数组使用shuffle方法?如果没有,有人能指导我切换到列表吗?我想这将有助于回答我的下一个问题。我唯一要做的就是在5张随机牌发完后,说明牌组中还有多少张牌。但是,看看我是如何使用阵列的,你不能从阵列中移除物品,因为它是固定的(对吗?),我想看看是否有一种方法可以模拟从阵列中移除卡片,这样它们就不会再次被处理?还是将数组转换为列表/集合更容易

这是我的密码。非常感谢您的帮助。另外,我也会接受任何关于清理代码的建议

public class CardGame {
    public static void main (String [] args) { 

    DeckOfCards deck = new DeckOfCards();
    //call shuffle
    deck.shuffle(1000);

   Card b;
   for (int i = 0; i < 5; i++) {
       b = deck.deal();
       System.out.println("Deal a card: " + b);  
    }
  }  
}


class Card {

   public static final int SPADE   = 4;
   public static final int HEART   = 3;
   public static final int CLUB    = 2;
   public static final int DIAMOND = 1;

   private static final String[] Suit = {"*", "Hearts", "Clubs", "Spades", "Diamonds"};
   private static final String[] Rank = {"*", "*", "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"};    

   private int cardSuit;
   private int cardRank;

   public Card( int suit, int rank ) {
      if ( rank == 1 )
         cardRank = 14;     // Give Ace the rank 14
      else
         cardRank = (int) rank;

      cardSuit = (int) suit;
   }

   public int suit() {
      return ( this.cardSuit );     
   }

   public String suitStr() {
      return( this.Suit[ this.cardSuit ] );  
   }

   public int rank() {
      return ( this.cardRank );
   }

   public String rankStr() {
      return ( Rank[ this.cardRank ] );
   }

   public String toString() {
      return ( Rank[ this.cardRank ] + " of "+ Suit[ this.cardSuit ] );
   }
}

class DeckOfCards {
   public static final int NEWCARDS = 52;
   private Card[] deckOfCards;         // Contains all 52 cards
   private int currentCard;            // deal THIS card in deck

   public DeckOfCards( ) {
      deckOfCards = new Card[ NEWCARDS ];
      int i = 0;

      for (int suit = Card.DIAMOND; suit <= Card.SPADE; suit++)
         for ( int rank = 1; rank <= 13; rank++ )
             deckOfCards[i++] = new Card(suit, rank);
             currentCard = 0;
   }
  //shuffle(n): shuffle the deck
   public void shuffle(int n) {
      int i, j, k;

      for ( k = 0; k < n; k++ ){ 
      i = (int) ( NEWCARDS * Math.random() );  // Pick 2 random cards
      j = (int) ( NEWCARDS * Math.random() );  // in the deck

      //swap these randomly picked cards
      Card temp = deckOfCards[i];
      deckOfCards[i] = deckOfCards[j];
      deckOfCards[j] = temp;
      }
      currentCard = 0;   // Reset current card to deal
   }

   //deal(): deal deckOfCards[currentCard] out
   public Card deal() {

      if (currentCard < NEWCARDS) {
         return ( deckOfCards[currentCard++] );
      }
      else{
         System.out.println("Out of cards error");
         return ( null );  // Error;
      }
   }

   public String toString() {
      String s = "";
      int k;
      k = 0;

      for ( int i = 0; i < 4; i++ ) {        
          for ( int j = 1; j <= 13; j++ )
             s += (deckOfCards[k++] + " ");
             s += "\n";
     }
      return (s);
   }
}
公共类卡片游戏{
公共静态void main(字符串[]args){
DeckOfCards deck=新的DeckOfCards();
//呼叫洗牌
牌组。洗牌(1000);
b卡;
对于(int i=0;i<5;i++){
b=deck.deal();
System.out.println(“交易a卡:+b”);
}
}  
}
班级卡{
公共静态最终整数SPADE=4;
公共静态最终int心脏=3;
公共静态最终积分俱乐部=2;
公共静态最终整数菱形=1;
私人静态最终字符串[]套装={“*”、“红心”、“梅花”、“黑桃”、“钻石”};
私有静态最终字符串[]秩={“*”,“*”,“Ace”,“2”,“3”,“4”,“5”,“6”,“7”,“8”,“9”,“10”,“杰克”,“女王”,“国王”};
私服;
私人int cardRank;
公共卡(国际诉讼、国际等级){
如果(秩==1)
cardRank=14;//将等级14设为Ace
其他的
cardRank=(int)秩;
cardSuit=(int)suit;
}
公共诉讼{
退换货(这件衣服);
}
公共字符串suitStr(){
退货(这套衣服[这套卡片]);
}
公共整数秩(){
返回(this.cardRank);
}
公共字符串rankStr(){
返回(秩[this.cardRank]);
}
公共字符串toString(){
返回值(秩[this.cardRank]+“+Suit[this.cardSuit]);
}
}
甲板类{
公共静态最终整数新卡=52;
私人卡[]deckOfCards;//包含所有52张卡
private int currentCard;//在牌组中处理此卡
公共甲板{
deckOfCards=新卡[新卡];
int i=0;

对于(int suit=Card.DIAMOND;suit,这里有一个完全可用的示例程序,它演示了您需要的所有东西—洗牌和从阵列中移除牌

样本卡类别:

public class Card {
    private String value = "";

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public Card(String value) {
        super();
        this.value = value;
    }

}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class CardGame {

    public static void main(String[] args) {

        List<Card> pack = new ArrayList<Card>();
        Card c1 = new Card("c1");
        Card c2 = new Card("c2");
        Card c3 = new Card("c3");
        pack.add(c1);
        pack.add(c2);
        pack.add(c3);

        System.out.print("List : ");
        CardGame.displayCardList(pack);

        Card[] packArr = cardListToArray(pack);

        System.out.print("Array : ");
        CardGame.displayCardArray(packArr);

        // http://stackoverflow.com/questions/4228975/how-to-randomize-arraylist
        long seed = System.nanoTime();
        Collections.shuffle(pack, new Random(seed));

        System.out.print("Shuffle List : ");
        CardGame.displayCardList(pack);

        packArr = cardListToArray(pack);

        System.out.print("Shuffle Array : ");
        CardGame.displayCardArray(packArr);

        System.out.print("Remove Card from Array : ");
        CardGame.removeCardFromArray(packArr, new Card("c1"));
        CardGame.displayCardArray(packArr);

    }

    public static boolean removeCardFromArray(Card[] packArr, Card card) {

        boolean cardFound = false;

        for (int i = 0; i < packArr.length; i++) {

            if (packArr[i].getValue().equalsIgnoreCase(card.getValue())) {
                packArr[i] = null;
                cardFound = true;
                break;
            }

        }

        return cardFound;

    }

    public static Card[] cardListToArray(List<Card> pack) {

        Card[] packArr = new Card[pack.size()];

        for (int i = 0; i < pack.size(); i++) {
            packArr[i] = pack.get(i);
        }

        return packArr;

    }

    public static void displayCardList(List<Card> pack) {

        for (Card c : pack) {
            System.out.print(c.getValue() + ", ");
        }
        System.out.println();
    }

    public static void displayCardArray(Card[] packArr) {

        for (Card c : packArr) {

            if (c == null) {
                System.out.print("REMOVED, ");
            } else {
                System.out.print(c.getValue() + ", ");

            }

        }
        System.out.println();
    }

}
示例程序:

public class Card {
    private String value = "";

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public Card(String value) {
        super();
        this.value = value;
    }

}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class CardGame {

    public static void main(String[] args) {

        List<Card> pack = new ArrayList<Card>();
        Card c1 = new Card("c1");
        Card c2 = new Card("c2");
        Card c3 = new Card("c3");
        pack.add(c1);
        pack.add(c2);
        pack.add(c3);

        System.out.print("List : ");
        CardGame.displayCardList(pack);

        Card[] packArr = cardListToArray(pack);

        System.out.print("Array : ");
        CardGame.displayCardArray(packArr);

        // http://stackoverflow.com/questions/4228975/how-to-randomize-arraylist
        long seed = System.nanoTime();
        Collections.shuffle(pack, new Random(seed));

        System.out.print("Shuffle List : ");
        CardGame.displayCardList(pack);

        packArr = cardListToArray(pack);

        System.out.print("Shuffle Array : ");
        CardGame.displayCardArray(packArr);

        System.out.print("Remove Card from Array : ");
        CardGame.removeCardFromArray(packArr, new Card("c1"));
        CardGame.displayCardArray(packArr);

    }

    public static boolean removeCardFromArray(Card[] packArr, Card card) {

        boolean cardFound = false;

        for (int i = 0; i < packArr.length; i++) {

            if (packArr[i].getValue().equalsIgnoreCase(card.getValue())) {
                packArr[i] = null;
                cardFound = true;
                break;
            }

        }

        return cardFound;

    }

    public static Card[] cardListToArray(List<Card> pack) {

        Card[] packArr = new Card[pack.size()];

        for (int i = 0; i < pack.size(); i++) {
            packArr[i] = pack.get(i);
        }

        return packArr;

    }

    public static void displayCardList(List<Card> pack) {

        for (Card c : pack) {
            System.out.print(c.getValue() + ", ");
        }
        System.out.println();
    }

    public static void displayCardArray(Card[] packArr) {

        for (Card c : packArr) {

            if (c == null) {
                System.out.print("REMOVED, ");
            } else {
                System.out.print(c.getValue() + ", ");

            }

        }
        System.out.println();
    }

}
import java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
导入java.util.Random;
公开课纸牌游戏{
公共静态void main(字符串[]args){
列表包=新的ArrayList();
卡c1=新卡(“c1”);
卡c2=新卡(“c2”);
卡c3=新卡(“c3”);
包装。添加(c1);
包装。添加(c2);
包装。添加(c3);
系统输出打印(“列表:”);
卡片游戏。显示卡片列表(套装);
卡片[]包装=卡片列表到阵列(包装);
系统输出打印(“数组:”);
CardGame.displayCardArray(Packager);
// http://stackoverflow.com/questions/4228975/how-to-randomize-arraylist
长种子=System.nanoTime();
收集。洗牌(打包,新随机(种子));
系统输出打印(“随机列表:”);
卡片游戏。显示卡片列表(套装);
packArr=卡片列表阵列(包装);
系统输出打印(“随机数组:”);
CardGame.displayCardArray(Packager);
System.out.print(“从阵列中移除卡:”);
CardGame.removeCardFromArray(Packager,新卡(“c1”));
CardGame.displayCardArray(Packager);
}
公共静态布尔removeCardFromArray(卡片[]包装,卡片){
布尔cardFound=false;
对于(int i=0;i

在Card类中,套装应该是一个枚举。您可以这样创建枚举

enum Suit {

    SPADE,
    HEART,
    CLUB,
    DIAMOND
};
那么这个类应该持有它当前的一个变量,比如

Suit suit;
您可以很容易地更改它的值

suit = Suit.HEART;
如果你必须使用索引来访问一套衣服,你可以使用

suit = Suit.values()[index];
return Rank[suit.ordinal()];
当获得你可以使用的卡的等级时

suit = Suit.values()[index];
return Rank[suit.ordinal()];
Card类中函数的名称不是您应该使用的典型名称。其中一些应该是getter。我建议使用GetSuiter()和GetSuiteName()这样的名称,您希望通过阅读这些名称就可以了解它们的功能。Suiter()这样的名称有点困惑,他们没有告诉你他们在用西装做什么

DeckOfCards

在DeckOfCards类中,初始化甲板时,为套装的每个循环使用一个for

for (Suit suit : Suits.values()) {

    ...
}

deckOfCards.get(index);

Random random = new Random();
int i = random.nextInt(NEWCARDS);
int j = random.nextInt(NEWCARDS);

Card temp = deckOfCards[i];
deckOfCards[i] = deckOfCards[j];
deckOfCards[j] = temp;
Arrays.asList(new ArrayList<Card>());
list.toArray();//This will return an array of Objects[]

Card[] cards = new Card[NEWCARDS];

list.toArray(cards)//This will store the list into the array cards.
//Note if the lists is bigger than the array it is storing it in, the function will return a new array that can hold all of the elemnents in the list.
public DeckOfCards() {
i = (int) ( NEWCARDS * Math.random() );

//should be

i = (int) (NEWCARDS * Math.random());