首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使字符串显示为框

使字符串显示为框
EN

Stack Overflow用户
提问于 2018-03-19 04:41:52
回答 4查看 117关注 0票数 3

我只是想不出怎么得到我想要的结果。这是我的密码

代码语言:javascript
复制
 import java.util.Scanner;
 public class StringInABox
 {
 public static void main(String[]args)
 {
      Scanner scan = new Scanner(System.in);

      System.out.println("Enter a phrase or word!");
      String Phrase = scan.nextLine();
      String CapPhrase = Phrase.toUpperCase();
      int PhraseLength = CapPhrase.length();
      String SidePhrase = CapPhrase.substring(1);
      int SidePhraseL = SidePhrase.length()-1;

      for (int Letter = 0; Letter<PhraseLength; Letter++)
           System.out.print(CapPhrase.charAt(Letter)+" ");
      System.out.println();

      for (int Letter = 0; Letter<SidePhraseL; Letter++)
          System.out.println(SidePhrase.charAt(Letter));

      for (int Letters = SidePhraseL-1; Letters>=0; Letters--)
      { for (int Space=0; Space <= PhraseLength*2-3;Space++)
           System.out.print(" ");
      System.out.println(SidePhrase.charAt(Letters));}


      for (int Letter = PhraseLength-1; Letter>=0; Letter--)
          System.out.print(CapPhrase.charAt(Letter)+" ");
      }
  }         

其结果应该是:

代码语言:javascript
复制
   H E L P 
   E     L
   L     E
   P L E H

但我只能得到:

代码语言:javascript
复制
   H E L P 
   E
   L
         L
         E
   P L E H

我的想法已经用完了。我是一个初学者,这不应该采取先进的编码。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-03-19 05:05:04

您非常接近,但这里的问题是for循环的顺序。要获得所需的输出,如下所示:

代码语言:javascript
复制
E          L
L          E

您需要在相同的循环中打印这两个字符,即当它在同一行上打印时。因此,您需要IndexFromFrontIndexFromBack变量,它们分别存储EL的值。

在初始循环之后打印字符H E L P

代码语言:javascript
复制
for (int Letter = 0; Letter < PhraseLength; Letter++)
   System.out.print(CapPhrase.charAt(Letter) + " ");
System.out.println();

您需要从first索引(即1 )开始访问EIndexFromBack的值将是PhraseLength-1-(IndexFromFront)。既然您有了必须从原始字符串中打印的值的索引,就需要得到正确的间距,即2*(PhraseLength-1)-1,因为在每个字符后面都有一个空格。所以你的第二个循环来打印线条

代码语言:javascript
复制
E          L
L          E

应如下:

代码语言:javascript
复制
for (int Letter = 1; Letter < PhraseLength-1; Letter++) {
    int IndexFromFront = Letter;
    int IndexFromBack = PhraseLength-1-Letter;
    // Print character from the start of string at given Index 
    System.out.print(CapPhrase.charAt(IndexFromFront));
    // Print required spaces
    for (int Space = 0; Space < 2*(PhraseLength-1)-1; Space++) {
        System.out.print(" ");
    }
    // End space print
    // Print character from the end of string matching the required index
    System.out.print(CapPhrase.charAt(IndexFromBack));
    // Printing on this line is complete, so print a new line.
    System.out.println();
}

最后一行,即给定输入字符串的反向,可以使用循环打印如下:

代码语言:javascript
复制
for (int Letter = PhraseLength - 1; Letter >= 0; Letter--)
   System.out.print(CapPhrase.charAt(Letter) + " ");
}

因此,最后的代码如下:

代码语言:javascript
复制
/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
public class StringInABox {
 public static void main(String[] args) {
  Scanner scan = new Scanner(System.in);

  System.out.println("Enter a phrase or word!");
  String Phrase = scan.nextLine();
  String CapPhrase = Phrase.toUpperCase();
  int PhraseLength = CapPhrase.length();

  for (int Letter = 0; Letter < PhraseLength; Letter++)
   System.out.print(CapPhrase.charAt(Letter) + " ");
  System.out.println();

  for (int Letter = 1; Letter < PhraseLength - 1; Letter++) {
   int IndexFromFront = Letter;
   int IndexFromBack = PhraseLength - 1 - Letter;
   System.out.print(CapPhrase.charAt(IndexFromFront));
   // Print required spaces
   for (int Space = 0; Space < 2 * (PhraseLength - 1) - 1; Space++) {
    System.out.print(" ");
   }
   // End space print
   System.out.print(CapPhrase.charAt(IndexFromBack));
   System.out.println();
  }

  for (int Letter = PhraseLength - 1; Letter >= 0; Letter--)
   System.out.print(CapPhrase.charAt(Letter) + " ");
 }
}

下面是HELPINGYOUOUT的示例输出

代码语言:javascript
复制
Enter a phrase or word!
H E L P I N G Y O U O U T 
E                       U
L                       O
P                       U
I                       O
N                       Y
G                       G
Y                       N
O                       I
U                       P
O                       L
U                       E
T U O U O Y G N I P L E H 

编辑:更易读的代码

代码语言:javascript
复制
/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
public class StringInABox {

    public static void printSpaces(int phraseLength) {
        for (int space = 0; space < 2 * (phraseLength - 1) - 1; space++) {
            System.out.print(" ");
        }
    }

    public static void printTopRow(String capPhrase, int phraseLength) {
        for (int letter = 0; letter < phraseLength; letter++)
            System.out.print(capPhrase.charAt(letter) + " ");
        System.out.println();
    }

    public static void printIntermediateBoxRows(String capPhrase, int phraseLength) {
        for (int letter = 1; letter < phraseLength - 1; letter++) {
            int indexFromFront = letter;
            int indexFromBack = phraseLength - 1 - letter;
            System.out.print(capPhrase.charAt(indexFromFront));
            // Print required spaces
            printSpaces(phraseLength);
            // End space print
            System.out.print(capPhrase.charAt(indexFromBack));
            System.out.println();
        }
    }

    public static void printLastRow(String capPhrase, int phraseLength) {
        for (int letter = phraseLength - 1; letter >= 0; letter--)
            System.out.print(capPhrase.charAt(letter) + " ");
    }


    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        System.out.println("Enter a phrase or word!");
        String phrase = scan.nextLine();
        String capPhrase = phrase.toUpperCase();
        int phraseLength = capPhrase.length();

        // Print the box
        printTopRow(capPhrase, phraseLength);
        printIntermediateBoxRows(capPhrase, phraseLength);
        printLastRow(capPhrase, phraseLength);
    }
}
票数 4
EN

Stack Overflow用户

发布于 2018-03-19 07:02:35

解决棘手问题的一个非常有用的策略是映射/绘制/记录所有正在变化的内容,并搜索模式。所以我们就从做这个开始。为了简单地跟踪值,我将在数组中显示这个过程。

代码语言:javascript
复制
String keyword = "test"

结果会是这样的。

代码语言:javascript
复制
[t][e][s][t]
[e][ ][ ][s]
[s][ ][ ][e]
[t][s][e][t]

第一行等于字符串,但我们将用与字符串中的字符索引相对应的值替换字母。Space将等于0

代码语言:javascript
复制
[1][2][3][1]
[2][0][0][3]
[3][0][0][2]
[1][3][2][1]

如果我们接受这些值,并将它们放在一行中,我们最终将得到

代码语言:javascript
复制
1231200330021321
1231 2003 3002 1321  //Easier to read version

第一和最后一行被反转,第二和第三行被反转。因此,我们可以用三个索引计数器产生输出。每个索引计数器都引用原始字符串中的一个字符。

第一个索引计数器将用于向前和向后读取整个字符串。

代码语言:javascript
复制
[t][e][s][t]    //From 0 -> (keyword.length-1)
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[t][s][e][t]    //From (keyword.length-1) -> 0

第二个计数器将用于在左侧进行索引,第三个计数器将用于在右侧进行索引。

代码语言:javascript
复制
[ ][ ][ ][ ]    //Be aware of possible out of bounds index errors
[e][ ][ ][s]    //From 1 -> (keyword.length-2)
[s][ ][ ][e]    //From (keyword.length-2) -> 1
[ ][ ][ ][ ]
票数 0
EN

Stack Overflow用户

发布于 2018-03-19 07:21:20

这是我的答案。我根据java命名标准重新命名了事物,解决了内存泄漏(Scanner未关闭),使用了方法,并解决了这样一个事实,即单词短语意味着单词之间可能有空格。

代码语言:javascript
复制
public static void main(String[] args) {

    try (Scanner scan = new Scanner(System.in)) {

        System.out.println("Enter a phrase or word!");
        String phrase = scan.nextLine();
        phrase = phrase.toUpperCase();
        phrase = cleanUpWordBoundaries(phrase);

        for (int letter = 0; letter < phrase.length(); letter++) {
            System.out.print(phrase.charAt(letter) + " ");
        }

        System.out.println();

        printSidePhrase(phrase);

        for (int letter = phrase.length() - 1; letter >= 0; letter--) {
            System.out.print(phrase.charAt(letter) + " ");
        }
    }
}

private static void printSidePhrase(String phrase) {

    int startIndex = 1;
    int lastIndex = phrase.length() - 2;

    for (int letter = 1; letter < phrase.length() - 1; letter++) {

        System.out.print(phrase.charAt(startIndex));

        // print spaces
        for (int i = 0; i < (phrase.length() - 2); i++) {
            System.out.print("  ");
        }

        System.out.print(" " + phrase.charAt(lastIndex));
        System.out.println();
        startIndex++;
        lastIndex--;
    }
}


private static String cleanUpWordBoundaries(String phrase) {

    String[] theWords = phrase.split("\\b");
    String newPhrase = new String();
    for (int i = 0; i < theWords.length; i++) {

        newPhrase += theWords[i];
        i++;
    }

    return newPhrase;
}

在运行程序时:

代码语言:javascript
复制
Enter a phrase or word!
w00 h00 bandit
W 0 0 H 0 0 B A N D I T 
0                     I
0                     D
H                     N
0                     A
0                     B
B                     0
A                     0
N                     H
D                     0
I                     0
T I D N A B 0 0 H 0 0 W 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49355907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档