如何让我的一个单词垂直打印?

时间:2015-10-19 05:17:06

标签: java for-loop printing crossword

这段代码中的单词应该以一个共同的字母相交,并且打印出的单词可以相互交叉多次。

我有正确的时间,但单词格式不正确。

应该看起来像这样:

 b
lottery
 a
 t

  b
  o
  a
lottery

   b
   o
   a
lottery

但我的打印出来是这样的:

b
lotto
    a
    t
                b
lotto
    a
    t
                b
lotto
    a
    t

我的代码显示如下,我的打印方法导致了什么问题?

 public class Assg23
{
    public static void main(String[] args)
    {

            String w1 = args[0];
            String w2 = args[1];

            int numberOfCrosses = 0;

            int pos1=0;
            int pos2=0;


            for(int i=0; i < w1.length(); i++)
            {
                for(int j=0; j < w2.length(); j++)
                {   
                    if(w1.charAt(i) == w2.charAt(j))
                    {
                        numberOfCrosses++;
                        crossesAt(w1, pos1, w2, pos2);
                        printCross(w1, pos1, w2, pos2);
                    }
                }
            }

        if(numberOfCrosses == 0)
        {
            System.out.println("Words do not cross");
        }
    }

    private static boolean crossesAt(String w1, int pos1, String w2, int pos2)
    {
        if(w1.charAt(pos1) == w2.charAt(pos2))
        {
            return true;
        }
        else
        {
            return false;
        }

    }

    private static void printCross(String w1, int pos1, String w2, int pos2)
    {
        for(int i=0; i < w1.length(); i++)
        {
            for(int j = 0; j < w2.length(); j++)
            {
                if((j== pos1) && i<w2.length())
                {
                    System.out.println(w2.charAt(i));
                }
                if((i == pos2) && j<w1.length())
                {   
                    System.out.print(w1.charAt(j));
                }
                else
                {
                    System.out.print(" ");
                }   

            }
        }



    }

2 个答案:

答案 0 :(得分:3)

以下是main()方法的正确版本。您会注意到我删除了crossesAt()方法,因为它所做的只是比较两个字符,这些字符可以在不到一行代码中完成。

public static void main(String[] args) {
    String w1 = args[0];
    String w2 = args[1];

    int numberOfCrosses = 0;

    for (int i=0; i < w1.length(); i++) {
        for (int j=0; j < w2.length(); j++) {
            if (w1.charAt(i) == w2.charAt(j)) {
                numberOfCrosses++;
                printCross(w1, i, w2, j);
            }
        }
    }

    if (numberOfCrosses == 0) {
        System.out.println("Words do not cross");
    }
}

以下是printCross()方法的正确实施方法:

private static void printCross(String w1, int pos1, String w2, int pos2) {
    // you can replace this for-loop with the line that follows it
    // if you don't get compiler errors
    String spaces = "";
    for (int i=0; i < pos1; ++i) spaces += " ";
    //String spaces = String.format(String.format("%%0%dd", pos1), 0).replace("0", " ");

    for (int i=0; i < w2.length(); ++i) {
        if (i == pos2) {
            System.out.println(w1);
        }
        else {
            System.out.println(spaces + w2.charAt(i));
        }
    }
}

以下是使用printCross()的示例:

printCross("boat", 1, "lottery", 1);
printCross("coffee", 4, "beverage", 3);

<强>输出:

 l
boat
 t
 t
 e
 r
 y
    b
    e
    v
coffee
    r
    a
    g
    e

答案 1 :(得分:0)

使用solution proposed by Tim(功劳归于他)这里是完整的代码:

public static void main(String[] args) {
        String w1 = "boat";
        String w2 = "lottery";

        int numberOfCrosses = 0;

        int pos1=0;
        int pos2=0;
        int spaces = 0;

        for(int i=0; i < w1.length(); i++)
        {
            for(int j=0; j < w2.length(); j++)
            {
                spaces = 0;
                if(w1.charAt(i) == w2.charAt(j))
                {
                    numberOfCrosses++;
                    printCross(w1, i, w2);
                } else spaces++;
            }
        }

        if(numberOfCrosses == 0)
        {
            System.out.println("Words do not cross");
        }
    }

    private static void printCross(String w1, int pos, String w2) {
        String spaces = String.format(String.format("%%0%dd", pos1), 0).replace("0", " ");
        int lengthToTraverse = (w1.length() > w2.length()) ? (w1.length()) : (w2.length());
        for (int i=0; i < lengthToTraverse; ++i) {
            if (i == pos) {
                System.out.println(w2);
            }
            else {
                if(i<w1.length()) {
                    System.out.println(spaces + w1.charAt(i));
                }
            }
        }
    }

我添加了对i的检查,并在方法中删除了一个额外的参数。输出它:

b lottery a t b o a lottery b o a lottery