Java 如何将整型数组打印成水平箭头?

Java 如何将整型数组打印成水平箭头?,java,arrays,Java,Arrays,具有一个数组,例如int[]arr=newint[]{9,6,5,2,1,2,6,3,2,7,3,8,1,5,4,7}我想这样打印它: * Output: * 9 * 6 1 * 5 2 2 * 2 6 7 1 * 3 3 5 * 8 4 * 7 * Intermediate Step: * 9 6 5 2 * 1 2 6 3 * 2 7 3 8 * 1 5 4 7 基本上这就是我想要做的。我打算遍历数组,只使用System.out.println()直到我到达“

具有一个数组,例如
int[]arr=newint[]{9,6,5,2,1,2,6,3,2,7,3,8,1,5,4,7}我想这样打印它:

 * Output:
 * 9
 * 6 1
 * 5 2 2
 * 2 6 7 1
 * 3 3 5
 * 8 4
 * 7 
 * Intermediate Step:
 * 9 6 5 2
 * 1 2 6 3
 * 2 7 3 8
 * 1 5 4 7
基本上这就是我想要做的。我打算遍历数组,只使用
System.out.println()直到我到达“结束”,这将是7,然后转到下一行,但这不起作用

我也尝试过打印9、6、1等等,但我也无法正常工作,我在这里不知所措,希望您能给我一些指导,告诉我如何才能把这件事想清楚

编辑

我的中间步骤是将数组设置为如下“块”:

 * Output:
 * 9
 * 6 1
 * 5 2 2
 * 2 6 7 1
 * 3 3 5
 * 8 4
 * 7 
 * Intermediate Step:
 * 9 6 5 2
 * 1 2 6 3
 * 2 7 3 8
 * 1 5 4 7

它应该适用于任何大小的数组。

好的,首先:不能为数组的每一个长度打印这样的三角形。例如,假设您拥有该数组,但缺少最后一个条目;那么你的三角形在某个点上会缺少一个元素。事实上,当且仅当元素数为自然数的平方时,才可以打印这样的三角形;在您的示例中,16=4^2。现在,这4也是你最长一行的长度

好的,现在怎么做。如果你看中间的步骤

9 6 5 2
1 2 6 3
2 7 3 8
1 5 4 7
并称之为
arr2
,您希望在第一行打印
arr2[0][0]
,在第二行打印
arr2[1][0]
arr2[0][1]
,依此类推,直到第4行(当然是初始数组长度的根)。因此,您可以编写一个嵌套循环,这样计算

然后在下一行打印
arr2[1][3]
arr2[2][2]
arr2[3][1]
,然后打印
arr2[2][3]
一个
arr2[3][2]
,最后一行就是
arr2[3][3]
。这在第二个嵌套循环中最容易实现


当然,我不会给出确切的代码,因为这显然是一项学习任务。但是我会告诉你,如果你有一个计数器
I
用于外部循环,一个计数器
j
用于内部循环,那么中间数组中的索引将取决于
I
j

让我们假设你有二维数组(你可以轻松地将一维更改为二维) 伪代码:

whereToGo = RIGHT;
i = 0;
j = 0;

maxX = WIDTH;
maxY = HEIGHT;
minX = 0;
minY = 0;

while (somethingLeft){
  addNumberToPyramid(array[i][j]);
  if (whereToGo == RIGHT){
    i++;
    if (maxX == i) {
      whereToGo = DOWN;
      minY++;
    }
  } else if (whereToGo == DOWN){
    //Same as if you go RIGHT, but increasing "j", at the end, you decrease maxY and then goLeft
  } //... other two directions
}
这就是如何解析输入。将其添加到金字塔的类似方法。我更喜欢创建另一个2D数组,将其直接放在金字塔中,然后编写正确打印此数组的方法:

public class Pyramid{
  //initialize minX, maxX etc.
  int[][] array;
  whereToGo = DOWN;
  int i = 0, j = 0;

  //initialize array size in constructor

  public void addNumberToPyramid(int value){
    if (whereToGo == DOWN){
      array[i][j] == value;
      j++;
      if (j == maxY){
        whereToGo = UPRIGHT;
        maxY -= 2;
      } else if (whereToGo == UPRIGHT){
      } //... other else if directions
    }    
  }
}
我认为这应该行得通 您迭代了2次。首先是第一行和它下面的所有对角线行,然后是最后一行和它上面的所有对角线行。但是,您必须创建第二个数组来保存此信息。我假设X和Y的阵列大小相同。使用4x4数据(您的数据)测试7x7、4x4等

String[][]array2=新字符串[array.length*2][array.length];
for(int mb=0;mb对于(int i=0;你能解释一下数组是如何转化为你想要的输出的吗?我在这里根本看不到一个模式。这就是我试图实现的。我将在这里添加一个中间步骤。你是否正确地编写了与样本输入对应的输出?因为在9,6,5,2之后对我来说没有意义。没有工作代码f或者让我来说明我丢失的原因,@libik它可能在我刚才添加的中间步骤之后工作。如果您想保持在同一行中,请使用
System.out.println(..)
,或者在使用
System.out.println(..)输出前为每行创建字符串
。我明白你的意思了,我的问题是,你如何在打印arr[1]上的6和arr[4]中的1之间移动,然后返回arr[2]中的5.考虑到最后的打印是:…615…啊,我误解了这个问题。无论如何,我已经编辑了我的答案,现在希望它能帮助你解决你的任务。:-)这里有错误,对吗?或者我误解了什么,比如
stringp2=array…
应该是array2,因为原来的是1D@LuisArmando这在中间步骤之后起作用:),因此数组是实际创建的中间步骤数组