如何格式化字符串输出,以便列均匀居中?

时间:2014-10-26 19:20:19

标签: java

在我的java课程中,我们编写了一个卡片程序,您可以在其中选择一张"秘密卡片",最后它会告诉您你的秘密卡是什么。我只有一个问题,那就是格式化输出。到目前为止,当它打印时,第一列是偶数,但第二列和第三列不是。我的老师说要使用空格,但我尝试了这个并且不起作用。我知道有一种方法可以格式化它,但我不确定。输出如下:

     Column 0           Column 1           Column 2
    ________________________________________________
     3 of Spades    3 of Diamonds  Ace of Diamonds
     9 of Diamonds    2 of Diamonds   10 of Diamonds
   Ace of Spades   10 of Hearts King of Clubs
     6 of Clubs    4 of SpadesQueen of Hearts
     5 of Diamonds    2 of Hearts    7 of Clubs
     2 of Spades Jack of Diamonds    3 of Hearts
     5 of Hearts    4 of Hearts    7 of Diamonds

我的输出代码如下:

import java.util.Scanner;
import java.util.Random;

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

/* declare and initialize variables */
int column = 0, i = 0;
String name = " ";
String playAgain = " ";
String seeDeck = " ";

/* Declare a 52 element array of cards */
Card[] deck = new Card[52];

/* Declare a 7 by 3 array to receive the cards dealt to play the trick */
Card [][] play = new Card[7][3];

/* Declare a Scanner object for input */
Scanner input = new Scanner(System.in);

如果你想我可以发布整个代码,但我试图不发布很多。我非常感谢任何帮助,因为我是Java新手。

4 个答案:

答案 0 :(得分:5)

请在回答StackOverFlow问题之前先做一些研究。

你听说过String格式吗?你使用类似于你现在可能使用的东西。看起来您正在使用System.out.print();打印出来吗?如果是这样,您可以将System.out.printf();%#一起使用。让我解释一下。

看起来你想打印出这样的东西。

Column 1     Column 2     Column 3
12           23           1234

嗯,解决问题的简单方法就是这样。

  int c1 = 12;
  int c2 = 23;
  int c3 = 1234;

  System.out.printf("%-22s%-22s%-22s\n","Column 1","Column 2","Column 3");
  System.out.printf("%-22d%-22d%-22d\n",c1,c2,c3);

让我们解释一下这里发生了什么,发生了很多事情。首先,只要您在%中看到System.out.printf()符号,就意味着即将执行特殊操作(在这种情况下为格式化)操作。

现在,让我们看一下方法的参数。 System.out.printf()的工作方式是在第一个参数中指定输出的格式。然后,实际输出是以下参数。您是否通过使用"%-22s%-22s%-22s\n"指定格式来了解它是如何开始的?然后,它实际输出它们,用逗号分隔?这是IMO最简单的格式化方式。

最后,让我们再看看我之前提到过的特殊行动。你看到-之后的字母和数字以及%是怎样的?这些都是服务目的。 --HERE--是一个学习更多知识的好地方,但我会给你基本的概述。

首先,负号指定哪一方将接收填充,填充是列之间的空间,使它们看起来很漂亮。由于它是负数,它将在右侧,(仅供参考,如果那里没有符号,填充将在左侧),所以它将打印输出,然后向右添加空格......但是有多少空间?

这个数字的来源。你看到的17个是从输出长度中减去多少个空格。简而言之,它将简单明了地确保每个输出在同一个地方开始和结束。唯一的问题是,确保数字22长于最大可能的字符串。我看到最长的可能是Queen of Diamonds所以大于19的任何东西应该这样做,我选择了22因为它看起来更好IMO。

接下来是字母,正如您所见,该字母在2个输出语句之间发生了变化。在这种情况下,一个人说s,另一个人说d。解决这个问题的简单方法是,如果你的输出是一个字符串,使用s,如果它和int(我不认为你需要它,我只需要我的例子,因为我的内容是int) ,使用d。

答案 1 :(得分:3)

我也采用"格式"建议,但我的有点不同。

在您的计划中,您依赖于自己卡片toString。因此,将其格式化为固定长度,然后您可以在任何地方使用它们,它们将占用相同的空间。

public String toString() {
    return String.format( "%5s of %-8s", rank, suit );
}

当您打印出来时,您的所有卡片都会在"""部分,我认为这是你在第一个输出专栏中的目的。

"%5s"部分右对齐5个字符宽的字段,"% - 8s"部分左对齐8字符宽的字段(这意味着如果西装短于8个字符,右边还有其他空格)。

答案 2 :(得分:1)

这是一种方法。

由于您知道String所用的"Queen of Diamonds"最长"Queen of Diamonds",因此您可以根据其长度进行分离。你这样做的方法是,为每个当前字符串添加空格,直到它的长度与"\t"的长度相匹配。然后添加所需的任何分隔,例如选项卡(static String[] cards = { "3 of Spades", "3 of Diamonds", "Ace of Diamonds", "9 of Diamonds", "2 of Diamonds", "10 of Diamonds", "Ace of Spades", "10 of Hearts", "King of Clubs", "6 of Clubs", "4 of Spades", "Queen of Hearts", "5 of Diamonds", "2 of Hearts", "7 of Clubs", "2 of Spades", "Jack of Diamonds", "3 of Hearts", "5 of Hearts", "4 of Hearts", "7 of Diamonds" }; static String getSeparation(int len) { String longest = "Queen of Diamonds"; StringBuilder sb = new StringBuilder(); // add spaces to match the longest string for(int i = 0; i < longest.length() - len; i++) { sb.append(" "); } sb.append("\t"); // add separation tab return sb.toString(); } static void print() { for(int i = 0; i < cards.length; i += 3) { System.out.println(cards[i] + getSeparation(cards[i].length()) + cards[i + 1] + getSeparation(cards[i + 1].length()) + cards[i + 2] + getSeparation(cards[i + 2].length())); } } public static void main(String[] args) { print(); } )。

以下是一个示例程序:

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

输出:

System.out.printf

较短的解决方案是使用String.formatstatic String[] cards = { "3 of Spades", "3 of Diamonds", "Ace of Diamonds", "9 of Diamonds", "2 of Diamonds", "10 of Diamonds", "Ace of Spades", "10 of Hearts", "King of Clubs", "6 of Clubs", "4 of Spades", "Queen of Hearts", "5 of Diamonds", "2 of Hearts", "7 of Clubs", "2 of Spades", "Jack of Diamonds", "3 of Hearts", "5 of Hearts", "4 of Hearts", "7 of Diamonds" }; static void print() { int spacingSeparation = 3; // number of spaces between columns int longest = "Queen of Diamonds".length(); // length of the widest column int spacing = longest + spacingSeparation; // total spacing for (int i = 0; i < cards.length; i += 3) { System.out.print(String.format( "%-" + spacing + "s%-" + spacing + "s%-" + spacing + "s\n", // format cards[i], cards[i + 1], cards[i + 2])); // values } } public static void main(String[] args) { print(); } 格式化输出:

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

输出:

{{1}}

答案 3 :(得分:-2)

我建议在列之间放置标签。使用制表符的唯一问题是字符串的长度可能会有所不同,因此您使用的制表符数量可能会发生变化。

但是,最好的事情是你知道最长的字符串是'钻石女王',你可以相应调整。我的猜测是两个或三个标签空间就够了,但你可以玩它。

换句话说,您的代码看起来像这样:

// loop to deal card
for(row = 0; row <7; row++){
   for(col = 0; col < 3; col++){
    play[row][col] = deck[card];
    System.out.print(play[row][col].toString() + "\t\t\t"); // Change here.
    card++;
}

System.out.println();