用java对单词进行排序以生成web输出

用java对单词进行排序以生成web输出,java,Java,我已经用java完成了一个正在开发的程序。我已经完成了我的代码和一切,但我的输出没有显示正确的方式。它应该看起来像一个网络,但我的输出不是。我已经发布了我的代码。我是为了教育的目的而询问社区,但没有得到答案 import java.util.*; import static java.lang.System.*; public class FancyWordThree { private String[][] mat; public

我已经用java完成了一个正在开发的程序。我已经完成了我的代码和一切,但我的输出没有显示正确的方式。它应该看起来像一个网络,但我的输出不是。我已经发布了我的代码。我是为了教育的目的而询问社区,但没有得到答案

   import java.util.*;
    import static java.lang.System.*;

    public class FancyWordThree
    {
        private String[][] mat;

       public FancyWordThree(String s)
        {
            //size the matrix
          mat = new String[s.length()*4-3][s.length()*4-3];
            //use Arrays.fill() to fill in the matrix with spaces
          for (int i = 0; i < mat.length; i++){
          Arrays.fill(mat[i], " ");
          }
            //use a for loop to load in the letters into the matrix
          for(int i = 0; i < mat.length; i++){
          for(int j = 0; j < mat.length; j++){
          int at = 0;
          if (i ==mat.length-j-1 && i !=0 || s.length()-j ==i)
          mat[i][j] = s.charAt(at)+"";
                }
          }
        }

    public String toString()
    {
        String output="";
      for (int i = 0; i < mat.length; i++){
      for (int j = 0; j < mat.length; j++){
      output = output+mat[i][j];
      }
      output = output +"\n";`enter code here`
      }
        return output+"\n\n";
    }
}

如果您没有获得正确的输出,我不确定您是否已完成程序

像所有的问题一样,关键是在你试图将算法转化为代码之前先解决它。在这种情况下,有一个非常清晰的模式:第一个字符放在4个方向上,然后单词从每个方向的每个位置拼写出来,但第一个字符放在的方向除外

为了清楚地说明这一点,我首先将方向转换为枚举:

private enum Dir {
    NE(+1, +1), 
    SE(+1, -1), 
    SW(-1, -1), 
    NW(-1, +1);

    private final int xd;
    private final int yd;

    private Dir(int xd, int yd) {
        this.xd = xd;
        this.yd = yd;
    }
}
这意味着您可以处理方向,而不必担心如何计算x和y方向的运动

接下来,编写代码以按给定方向输出值:

private void setWebAt(String input, Dir dir) {
    int x = (dir.xd + 2) * (input.length() - 1);
    int y = (dir.yd + 2) * (input.length() - 1);
    Arrays.stream(Dir.values())
        .filter(d -> !d.equals(dir))
        .forEach(d -> IntStream.range(0, input.length())
            .forEach(i -> result[x + i * d.xd][y + i * d.yd] = input.charAt(i)));
}
注意过滤器,以防止在给定方向上输出单词

理想情况下,您应该在继续之前为此代码编写单元测试

最后,输出四个方向的代码非常简单:

Arrays.stream(Dir.values()).forEach(dir -> setWebAt(input, dir));
剩下的是初始化和打印数组的非常简单的填充程序

如果您不熟悉流,可以将它们全部更改为
for
循环

private void setWebAt(String input, Dir dir) {
    int x = (dir.xd + 2) * (input.length() - 1);
    int y = (dir.yd + 2) * (input.length() - 1);
    Arrays.stream(Dir.values())
        .filter(d -> !d.equals(dir))
        .forEach(d -> IntStream.range(0, input.length())
            .forEach(i -> result[x + i * d.xd][y + i * d.yd] = input.charAt(i)));
}
Arrays.stream(Dir.values()).forEach(dir -> setWebAt(input, dir));