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

在我的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新手。

我也会采用“格式”建议,但我的观点有点不同。

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

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

当你打印出来时,你的所有卡片都会在“of”部分对齐,我认为这就是你在第一个输出栏中的目标。

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

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

你听说过String格式吗? 你使用类似于你现在可能使用的东西。 看起来你正在使用System.out.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); 

让我们解释一下这里发生了什么,发生了很多事情。 首先,每当您在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(我不认为你需要它,我只是为了我的例子,因为我的是我的内容),使用d。

这是一种做法。

既然你知道你将拥有的最长的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 

更简短的解决方案是使用String.formatSystem.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(); } 

输出:

 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 

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

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

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

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