我如何在Java中居中字符串

时间:2018-10-30 23:22:31

标签: java string

对不起,这是一堆混乱的代码,但是我希望我的程序输出类似这样的内容

example of what i want

我可以接近它,但文字不是在星星内部,而是居中或居中,并且中间居中的三个星星在这里,是我的代码

import java.util.Scanner;

public class test {

    public static void main(String[] args) {
        // TODO code application logic here
        String msg;
        int width = 54;
        Scanner pipe = new Scanner (System.in);
        System.out.print ("Enter a message to for a header: ");
        msg = pipe.next();
        int spaceTaken = width - msg.length();
        int center = (spaceTaken - msg.length()) / 2;

        for (int i = 1; i <= 1; i++) {
            for (int x = 1; x <= 60; x++) {
                System.out.print ("*");
            }
            System.out.println ();
        }
        for (int i = 1; i <= 1; i++) {
            for (int x = 1; x <= 3; x++) {
                System.out.print ("*");
            }
        }
        for (int i = 1; i <= 1; i++) {
            for (int x = 1; x <= center + msg.length(); x++) {
                System.out.print (" ");
            }
        }
        System.out.format ("%" + msg.length() + "s", msg);
        for (int i = 1; i <= 1; i++) {
            for (int x = 1; x <= center - (msg.length() / 2); x++) {
                System.out.print (" ");
            }
        }
        for (int i = 1; i <= 1; i++) {
            for (int x = 1; x <= 3; x++) {
                System.out.print ("*");
            }
            System.out.println ();
        }
        for (int i = 1; i <= 1; i++) {
            for (int x = 1; x <= 60; x++) {
                System.out.print ("*");
            }
            System.out.println ();
        } 
    }

}

4 个答案:

答案 0 :(得分:0)

我相信有很多库都可以做到这一点,但是作为一个练习-下面的函数将生成类似*** message ***的行(虽然并不完美):

public String center(String message, int length, int sides, char border) {
    if(message.length() + 2*sides > length) {
        throw new IllegalStateException("Cannot center " + message + " within " + length + 
                                        "characters");
    }   
    int chars = message.length() + 2*sides;
    int gap = (length - chars)/2;
    int extra = (length - chars) % 2;
    StringBuilder line = new StringBuilder();
    for(int i = 0; i < sides; i++) {
        line.append(border);
    }   
    for(int i = 0; i < gap; i++) {
        line.append(" "); 
    }   
    line.append(message);
    for(int i = 0; i < gap + extra; i++) {
        line.append(" "); 
    }   
    for(int i = 0; i < sides; i++) {
        line.append(border);
    }   
    return line.toString();
}

答案 1 :(得分:0)

您的解决方案中有很多问题。

对不起,我不明白你的逻辑。

但是我会给你一些提示,让你不明白。

1)请勿使用for (int i = 1; i <= 1; i++) {...}

2)这是最重要的,您必须划分 Left Right 空间,并知道某些左侧或右侧可以有一个额外的起点。

3)将您的问题划分为各种方法,您应该有一个控制台 getMessage 的方法,一种计算所有开始次数的方法,并在中心显示消息。

4)您的班级名称应以大写开头(符合惯例)。

5)比StringBuilder更喜欢String,这是有效的。

我已尝试使其尽可能简单以使您理解:

....

public static void main(String[] args) {
    // TODO code application logic here
    String msg;
    int width = 60;
    Scanner pipe = new Scanner(System.in);
    System.out.print("Enter a message to for a header: ");
    msg = pipe.next();
    StringBuilder asterisk = new StringBuilder(width);
    for (int x = 1; x <= 60; x++) {
        asterisk.append("*");
    }
    int qntSpaceBlank = (width - msg.length() - 6);

    int qtdSpaceLeft;
    int qtdSpaceRigth;
    if (qntSpaceBlank % 2 == 0) {
        qtdSpaceLeft = qntSpaceBlank / 2;
        qtdSpaceRigth = qntSpaceBlank / 2;
    } else {
        qtdSpaceLeft = qntSpaceBlank / 2;
        qtdSpaceRigth = qntSpaceBlank/2 + 1;
    }
    StringBuilder spaceBlankLeft = new StringBuilder(qtdSpaceLeft);
    StringBuilder spaceBlankRight = new StringBuilder(qtdSpaceRigth);

    for (int i = 1; i <= qtdSpaceLeft; i++) {
        spaceBlankLeft.append(" ");
    }
    for (int i = 1; i <= qtdSpaceRigth; i++) {
        spaceBlankRight.append(" ");
    }
    StringBuilder textCenter = new StringBuilder(width);
    textCenter.append("***")
            .append(spaceBlankLeft)
            .append(msg)
            .append(spaceBlankRight)
            .append("***");

    System.out.println(asterisk);
    System.out.println(textCenter);
    System.out.println(asterisk);
}

...

答案 2 :(得分:0)

有些想法可以用来打印所需的输出。请注意,这些是“工具”-可以使用它们来编写正确的程序。它具有一些自由文本程序逻辑和图片,以帮助“发现”问题。

程序逻辑:

Initial:
Total length = 60
Length of three stars = 3
Message length allowed = (Total length) - (Length of three stars * 2)
Accept/Enter Message string
Message length = Input string length
If Message length is zero  or greater than Message length allowed
    Cannot print - abort program.

Begin printing:
Print the beginning sixty stars
Print the first 3 stars
Starting length = (Total length / 2) - (Length of three stars) - (Message length / 2)
Print spaces upto the Starting length
Print the Message string
Ending length = Starting length
If message length is odd number
    Ending length = Starting length - 1
Print spaces upto the Ending length
Print the last 3 stars
Print the end sixty stars
End printing.


enter image description here

答案 3 :(得分:0)

中心计算不正确,在您的情况下,它始终是静态的。以下是代码的输出,请注意字符串起始点始终是静态的:

************************************************************
***                           a                          ***
************************************************************
************************************************************
***                           aa                        ***
************************************************************
************************************************************
***                           aaa                       ***
************************************************************

字符串的中心不会根据字符串的长度而改变。进行以下代码更改(您的代码已注释):

  1. 中心计算逻辑:

//int center = (spaceTaken - msg.length()) / 2; int center = (width - msg.length()) / 2;

  1. 后缀空格到中心:

//for (int x = 1; x <= center + msg.length(); x++) { for (int x = 1; x <= center; x++) {

  1. 前缀剩余空间:

//for (int x = 1; x <= center - (msg.length() / 2); x++) { for (int x = 1; x <= center; x++) {

  1. 对于奇数长度的字符串,请添加一个额外的空格。在空格加前缀之后并在打印结束"*"之前,添加以下代码:

if( msg.length() % 2 > 0 ) System.out.print (" ");

以下是代码更改后的输出,请注意字符串起点如何更改:

************************************************************
***                          a                           ***
************************************************************
************************************************************
***                          aa                          ***
************************************************************
************************************************************
***                         aaa                          ***
************************************************************

最后,可以对代码进行改进,以提高可重用性,可读性和可管理性。首先,请考虑将重复代码推入方法。例如,要打印边框,您可以创建一个printBorder()。创建一个单独的方法(带有必需的参数),该方法将在居中之后返回一个字符串。