当前位置: 首页 > 知识库问答 >
问题:

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

谯皓君
2023-03-14

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

共有3个答案

章睿
2023-03-14

这里有一种方法。

因为你知道你将拥有的最长的字符串是“钻石皇后”,你可以根据它的长度来区分。方法是,为每个当前字符串添加空格,直到其长度与“钻石女王”的长度匹配。然后添加任何想要的分隔符,例如选项卡(“\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  

车胤运
2023-03-14

你使用的东西和你现在可能正在使用的东西类似。看起来您正在使用系统打印。出来打印() 对吗?如果是这样,您可以使用系统。出来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);

让我们解释一下这里发生了什么,发生了很多事情。首先,每当你看到%登录系统时。出来printf(),这意味着一个特殊的(在本例中是格式化)操作即将执行

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

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

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

这就是数字的来源。你看到的17是输出长度中减去多少个空格。长话短说,它会简单明了地确保每个输出在同一个地方开始和结束。唯一的问题是,确保数字22比最大可能的字符串长。我认为最长的可能是钻石皇后,所以任何大于19的都应该这样做,我选择了22因为它看起来更好。

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

楚修为
2023-03-14

我也同意“格式”的建议,但我的有点不同。

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

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

当您打印出来时,您将把所有的卡片都排在“of”部分,我认为这就是您在第一个输出列中想要的。

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

 类似资料:
  • 问题内容: 我想知道是否有一种简单的方法来格式化dict-outputs的字符串,例如: …,简单的str(dict)只会让您难以理解… 就我对Python的了解而言,我将不得不编写许多带有许多特殊情况和string.replace()调用的代码,而这个问题本身看起来并不太像一个1000行的问题。 请建议根据此形状格式化所有字典的最简单方法。 问题答案: 根据您对输出所做的操作,一种选择是将JSO

  • 问题内容: 我正在处理一个包含坐标x,y,z的文本文件 每行使用 处理完数据后,我需要将坐标写回到另一个txt文件中,以便使每一列中的项目(以及输入文件)都正确对齐。每行由坐标组成 C ++中是否有任何类似操纵器的控件可以设置宽度和对齐方式? 问题答案: 使用更新的语法尝试这种方法: 以下是使用旧语法(对不支持的旧版Python有用)的方法:

  • 问题内容: print(‘%24s’ % “MyString”) # prints right aligned print(‘%-24s’ % “MyString”) # prints left aligned 如何在中间打印?有快速的方法吗? 我不希望文本位于屏幕的中心。我希望它位于 那 24个空间的中心。如果我必须手动执行此操作,则添加相同编号后的数学原理是什么。文字前后的空格? 问题答案:

  • 问题内容: 我有一个对象。 如何呈现以下片段的一部分? 我有另一个图书馆的“相对语言时间”部分。 我尝试了以下方法: 但这给了我: 问题答案: 已经有一个名为的函数: 如果您以某种方式使用了不支持它[的浏览器,那么我可以满足您的要求:

  • 问题内容: 我有一个对象传递给我的方法。我需要查看包括其子节点的整个xml字符串(整个对象图)。我正在寻找一种可以将转换Element为xml格式字符串的方法。只是在’Element’对象上将不起作用,因为将不会输出xml格式,也不会通过其子节点。有没有一种简便的方法而无需编写自己的方法来做到这一点?谢谢。 问题答案: 假设您要坚持使用标准API … 您可以使用DOMImplementationL

  • 问题内容: 我想知道如何使用f字符串以Pythonic方式格式化这种情况: 问题是不能在f字符串的表达式部分内使用。预期产量: 问题答案: 你不能 反斜杠不能出现在花括号内;这样做会导致: 这是在PEP中为f字符串指定的: 反斜线可能不会出现在f字符串的表达式部分内,[…] 一种选择是先命名,然后再在-string内进行命名;也就是说,不使用文字: 结果是: @wim指定的另一个选项是用来获取返回