2017-03-31 74 views
1

我初学者使用toString()方法返回格式化的字符串。我打印一副扑克牌,每列都是不同的套装。有没有人有任何想法?下面是我的代码有:格式化toString()

public class DeckOfCards { 
    public static void main(String[] args) { 
    int[] deck = new int[52]; 
    //String[] suits = {"Spades", "Hearts", "Diamonds", "Clubs"}; 
    String[] suits = {"Clubs","Diamonds","Hearts","Spades"}; 
    //String[] ranks = {"Ace","King", "Queen", "Jack", "10", "9", "8", "7", "6", "5", "4", "3", "2"}; 
    String[] ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King","Ace"}; 


    // Initialize cards 
     for (int i = 0; i < deck.length; i++) { 
      deck[i] = i; 
     } 

     // Shuffle the cards 
     for (int i = 0; i < deck.length; i++) { 
      int index = (int)(Math.random() * deck.length); 
      int temp = deck[i]; 
      deck[i] = deck[index]; 
      deck[index] = temp; 
     } 

     // Display the all the cards 
     for (int i = 0; i < 52; i++) { 
      String suit = suits[deck[i]/13]; 
      String rank = ranks[deck[i] % 13]; 
      System.out.println(rank + " of " + suit); 
     } 


     System.out.println("------------------------------"); 

     for(int i=0;i<deck.length;i++){ 
      for(int j=i;j<deck.length;j++){ 
       if(deck[j]==51-i){ 
        int temp = deck[i]; 
        deck[i] = deck[j]; 
        deck[j] = temp; 
       } 
      } 
     } 

     // Display the all the cards 
     for (int i = 0; i < 52; i++) { 
      String suit = suits[deck[i]/13]; 
      String rank = ranks[deck[i] % 13]; 
      System.out.printf(rank + " of " + suit + "\t"); 
     } 

    } 
    } 

我相信会在toString()方法的主要领域是在这里:

// Display the all the cards 
     for (int i = 0; i < 52; i++) { 
      String suit = suits[deck[i]/13]; 
      String rank = ranks[deck[i] % 13]; 
      System.out.println(rank + " of " + suit); 
     } 

我怎么会在toString()方法使用,也实例一个可以打印这个toString()方法的对象?感谢您的时间。因此,它依次显示在桥的比赛,我想输出的是这样的:

Ace of Spades  Ace of Hearts  Ace of Diamonds  Ace of Clubs 
... 
// And so on until it reaches two of clubs 

做这些方式打印它像这样没有一个是多余的间隔,或者如果没有什么可以在被修改toString()让它出来呢?再次感谢您的时间。

回答

0

下面是制作卡片和卡组课程的示例代码,并打印出整个卡组。

class Deck { 
    ArrayList<Card> cards = new ArrayList<Card>(); 
    public Deck() { 
     for(int i=0; i < 52; i++) { 
      cards.add(new Card()); 
     } 
    } 

    @Override 
    public String toString() { 
     String response = ""; 
     for(int i=0; i<52; i++) 
     { 
      response = response + "\n" + i+1 + ". Card: " + cards.get(i).toString() ; 
     } 
     return response; 
    } 
} 

class Card { 

    private String suit; 
    private String rank; 

    @Override 
    public String toString() { 
     return "It's a " + suit + " " + rank; 
    } 

    public Card() { 
     Random r = new Random(); 
     int rRank = r.nextInt(12); 
     switch(rRank) { 
      case 0: { 
       this.rank = "Jack"; 
       break; 
      } 
      case 1: { 
       this.rank = "Queen"; 
       break; 
      } 
      case 11: { 
       this.rank = "King"; 
       break; 
      } 
      case 12: { 
       this.rank = "Ace"; 
       break; 
      } 
      default: { 
       this.rank = rRank + ""; //Don't blame me for it. :D 
       break; 
      } 
     } 
     int suit = r.nextInt(3); 
     switch(suit) { 
      case 0: { 
       this.suit = "Club"; 
       break; 
      } 
      case 1: { 
       this.suit = "Diamond"; 
       break; 
      } 
      case 2: { 
       this.suit = "Heart"; 
       break; 
      } 
      case 3: { 
       this.suit = "Spade"; 
       break; 
      } 
     } 

    } 

} 


public class Stackoverflow { 

    public static void main(String[] args) { 
     Deck deck = new Deck(); 
     System.out.println(deck.toString()); 
    } 

} 
1

您必须创建一个新的类卡,并有一个被覆盖的字符串类

所以像下面

public class Cards { 

    private int numb; 
    private int suite; 

    public Cards(int suite, int numb) { 
     this.numb = numb; 
     this.suite = suite; 
    } 

    public int getNumb() { 

     if (numb == 0){ 
      return 11; 
     } 

     if (numb >= 9 && numb <=12){ 
      return 10; 
     } 

     return numb + 1; 
    } 

    @Override 
    public String toString() { 

     String arbNumb = null; 
     String arbSuite = null; 

     switch (suite){ 

     case 0: 
      arbSuite = "Heart"; 
      break; 

     case 1: 
      arbSuite = "Diamond"; 
      break; 

     case 2: 
      arbSuite = "Spades"; 
      break; 

     case 3: 
      arbSuite = "Clubs"; 
      break; 

     } 

     switch (numb){ 

     case 0: 
      arbNumb = "Ace"; 
      break; 

     case 10: 
      arbNumb = "Jack"; 
      break; 

     case 11: 
      arbNumb = "Queen"; 
      break; 

     case 12: 
      arbNumb = "King"; 
      break; 

     } 

     if (numb > 0 && numb < 10){ 
      arbNumb = String.valueOf(numb+1); 
     } 

     return arbNumb + " of " + arbSuite; 
    } 

} 

它的意思是,当你实例化类Cards,数字将当您致电yourInstanceOfClass.toString时,转换为相应的字符串。您可以为套件和号码做到这一点。

我已经分配的数字就是我将如何做,但你可以改变它们到你的偏好当然。

getNumb()班只是为了反映我所做的数字的变化。

0

你的洗牌和Fisher-Yates shuffle类似,但不是完全相同,并且不会给你卡片所有排列的均匀分配。 (Java配套的java.util.Collections类的费雪耶茨洗牌您可以使用Collections.shuffle(list)洗牌的对象列表到随机顺序

一旦你得到每张牌的花色和等级,你可以把它们放入一个列表。:

List<Card> cards = new ArrayList<>(); 

    for (int i = 0; i < 52; i++) { 
     String suit = suits[deck[i]/13]; 
     String rank = ranks[deck[i] % 13]; 
     cards.add(new Card(suit, rank)); 
    } 

(你需要在你的文件的顶部向java.util导入这些类)。

import java.util.ArrayList; 
import java.util.List; 

toString方法创建一个类卡:

public class Card { 
    private final String suit; 
    private final String rank; 

    public Card(String suit, String rank) { 
     this.suit = suit; 
     this.rank = rank; 
    } 

    public String getSuit() { 
     return suit; 
    } 

    public String getRank() { 
     return rank; 
    } 

    @Override 
    public String toString() { 
     return rank + " of " + suit; 
    } 
} 

我已经包括了一些你并不严格需要的东西。这些字段不一定是final,但稍后可以使用不变的对象。一旦你创建了钻石王后,它不需要永远变成另一张牌。一个好的经验法则是,除非真的需要,否则不要让对象变化。 (一张可变卡片的字段不是final,并且会为字段提供setter,而不仅仅是getter。)尽管我们还没有在这里使用它们,但我也为这些字段提供了getters。并且我在toString方法中包含了@Override注释,但这并不是绝对必要的,但是如果在打算重写某个方法时包含它,编译会在您不注意时发出警告,如果我不小心写入了tostring而不是toString

现在,我们有我们的cards,我们可以让他们自己打印出来使用他们toString方法:

for (Card card : cards) { 
    System.out.println(card); 
} 

一个最后一个音符。在你的代码中,你没有正确使用System.out.printf。如果你想使用类似的东西在你的toString方法,存在StringString.format相关的方法,它的使用应该是这样的:

@Override 
    public String toString() { 
     return String.format("%s of %s", rank, suit); 
    } 

或者,当您打印卡片,你可以使用它像这样(%n产生一个换行符):

for (Card card : cards) { 
    System.out.printf("Your card is the %s%n", card); 
} 
1

如果你想实例的对象,这是我的解决方案:

Card.java

/*-*************************************************************************** 
* Copyright (C) 2017 Miguel Fernandez Fernandez 
* 
* This is free software, licensed under the GNU General Public License v3. 
* See http://www.gnu.org/licenses/gpl.html for more information. 
****************************************************************************/ 

public class Card { 

    String suit; 
    String rank; 

    public Card(String suit, String rank) { 
     this.suit = suit; 
     this.rank = rank; 
    } 

    public String getSuit() { 
     return suit; 
    } 

    public void setSuit(String suit) { 
     this.suit = suit; 
    } 

    public String getRank() { 
     return rank; 
    } 

    public void setRank(String rank) { 
     this.rank = rank; 
    } 

    @Override 
    public String toString() { 
     return rank + "\t" + suit; 
    } 
} 

Main.java

/*-*************************************************************************** 
* Copyright (C) 2017 Miguel Fernandez Fernandez 
* 
* This is free software, licensed under the GNU General Public License v3. 
* See http://www.gnu.org/licenses/gpl.html for more information. 
****************************************************************************/ 

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

public class Main { 

    public static void main(String[] args) { 

     List<Card> deck = new ArrayList<Card>(52); 
     String[] suits = { "Clubs", "Diamonds", "Hearts", "Spades" }; 
     String[] ranks = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace" }; 

     // Initialize cards 
     for (int i = 0; i < 4; i++) { 
      for (int j = 0; j < 13; j++) { 
       deck.add(new Card(suits[i], ranks[j])); 
      } 
     } 

     System.out.println("Cards: \n"); 

     // Print cards 
     for (Card c : deck) { 
      System.out.println(c.toString()); 
     } 

     System.out.println("\n\nRandom cards...\n\n"); 

     // Shuffle the cards 
     Collections.shuffle(deck); 
     System.out.println("Cards: \n"); 

     // Display the all the cards 
     for (Card c : deck) { 
      System.out.println(c.toString()); 
     } 
    } 
} 

谢谢! :)