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

Java 如何格式化字符串输出,使列均匀居中?,java,Java,在我的java类中,我们编写了一个卡片程序,您可以在其中选择一张“秘密卡片”,最后它会告诉您您的秘密卡片是什么。我只有一个问题,那就是格式化输出。现在,当它打印第一列时,第二列和第三列是偶数,但第二列和第三列不是偶数。我的老师说要使用空格,但我已经试过了,但不起作用。我知道有一种格式化的方法,但我不确定。输出如下所示: Column 0 Column 1 Column 2 _________________________________

在我的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
// 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();
我的输出代码如下:

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新手。

我建议在列之间添加选项卡。使用制表符的唯一问题是字符串的长度可能不同,因此您使用的制表符数量可能会改变

不过,好的是,你知道最长的字符串是“钻石皇后”,你可以据此进行调整。我猜两到三个制表位就足够了,但是你可以用它

换句话说,您的代码将如下所示:

     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
// 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();
//循环到交易卡

对于(row=0;row,这里有一种方法

由于您知道最长的
字符串是
“钻石皇后”
,因此可以根据其长度进行分隔。方法是,为每个当前字符串添加空格,直到其长度与
“钻石皇后”的长度匹配
。然后添加您想要的任何分隔,例如选项卡(
“\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();
}
较短的解决方案是使用或
System.out.printf
格式化输出:

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 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();
}

您使用的东西与您现在可能正在使用的东西类似。看起来您正在使用
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);
嗯,解决这个问题的简单方法是这样的

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”指定格式开始的吗
?然后,它实际输出它们,用逗号分隔?这是最简单的格式化方法

最后,让我们再看一看我前面提到的特别行动。你可以看到在
%
之后有字母和数字以及
-
?这些都是有用的。这是一个了解更多信息的好地方,但我会给你一个基本的概述

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

这就是这个数字的来源。你看到的17是从输出长度中减去多少空格。长话短说,它将简单明了地确保每个输出在同一个位置开始和结束。唯一需要注意的是,确保数字22比可能的最大字符串长。我看到了最长的一个可能是
钻石女王
所以任何大于19的都可以,我选择了22,因为在我看来它看起来更好

下一个是字母,正如你所看到的,这两个输出语句之间发生了变化。在这种情况下,一个是s,另一个是d。解决这个问题的简单方法是,如果你的输出是一个字符串,使用s,如果是和int(我想你不需要它,因为我的示例是int),使用d。

我也使用“格式”建议,但我的有点不同

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

public String toString() {
    return String.format( "%5s of %-8s", rank, suit );
}
当你打印出来的时候,你的所有卡片都会在“of”部分对齐,我想这就是你在第一个输出栏中的目的


“%5s”部分右对齐5个字符宽的字段中的排名,“%-8s”部分左对齐8个字符宽的字段中的套装(这意味着如果套装短于8个字符,则右侧会有额外的空格)。

请发布完整的循环代码。最简单的方法是添加选项卡(
'\t'
)在列之间,以便match@nem这取决于每个标签的长度……有些标签可能太长,无法使用work@DreadHeadedDeveloper是的,但在这种情况下,他可以查看输出并添加测试,测试有多少选项卡可以使列匹配。用谷歌搜索很容易,它找到了以前的Stackoverflow答案:如何更改长度制表符的数量?当我这样做时,列0和1是正确的,但实际上相距很远。我从未见过使用的“制表符”方法。好吧,你可以更改使用的制表符数量。也许你需要将
\t\t\t
更改为
\t\t
。这就是我的意思,你可能需要玩一点。制表符可能(无可否认)这不是最好的方法。@WeatherVane在你的问题的评论中链接到了一个很好的方法,这可能也会有帮助。谢谢你,我在网上和我的书中做过研究。我甚至看了提供的网站,但解释让我困惑,我不理解他们解释的方式。我想学习和理解材料,所以我请你花点时间把所有这些都打印出来