我试图逐行反转一个数组

时间:2013-04-22 21:19:18

标签: java arrays

澄清一下,这是一项家庭作业。我只是在寻找建议,我不是在寻找别人为我做功课。

我上半场已经完成了。它使用两个数组来打印Asterisk设计(在这种情况下,字母'S'。工作正常。然后,我跳过两行并打印设计但翻转(所以每行反转)。它似乎工作正常,但是当我运行程序时,它打印出两个S,而第二个没有反转。有什么想法我做错了吗?

public class Design {
   public static void main (String [] args) {
       char [] array = new char [150];
       for (int index = 0; index < array.length; index ++) 
       {
         array [index] = '#';
       }
       int [] indexNumbers = {
           0,1,2,3,4,5,6,7,8,9,10,20,30,40,50,
           60,70,71,72,73,74,75,76,77,78,79,89,99,109,119,129,139,140,
           141,142,143,144,145,146,147,148,149
       };
       for (int i = 0; i < indexNumbers.length; i++) 
       {
         array [indexNumbers[i]] = ' ';
       }
      for (int index = 0; index < array.length; index ++)
      {
         if (index % 10 == 0 && index > 0) 
         System.out.println();
         System.out.print (array[index]);
      }

      //Now, to reverse the letter

      System.out.println();
      System.out.println();

      int lines = 5;
      for (int i = 0; i< array.length; i++){
        if (i >= lines)
          lines += 10;
        char temp = array [i];
        array [i] = array [lines - i - 1];
        array [lines - i - 1] = temp;
      }
      for (int index = 0; index < array.length; index ++)
      {
        if (index % 10 == 0 && index > 0) 
          System.out.println();
          System.out.print (array[index]);
      }
    }
  }
编辑:是的......设计是在空间,其他一切都是星号。

3 个答案:

答案 0 :(得分:1)

首先,为什么不使用String[]char[][]?相反,您使用一个简单的数组来放置多行。这会使您的代码混淆和脆弱。

要交换数组,规则通常很简单:获取第一行和最后一行并交换它们。获得第二个和第二个,并交换它们,得到第三个和第三个并交换它们......直到你到达中间。如果您有一个数组,其中每个元素都是一行(如String[]char[][]中),这将更容易。

如果你需要保持一个简单的char[]的想法,其中每个10-char块都是一行,只需交换每个10-char块,如上所述。

如果您不想更改程序的一般行为,则这是一个有问题的块:

  int lines = 5;
  for (int i = 0; i< array.length; i++){
     if (i >= lines)
        lines += 10;
    char temp = array [i];
    array [i] = array [lines - i - 1];
    array [lines - i - 1] = temp;
  }

你不是在这里交换线路,而是交换字符。这样,你的if不是检查和跳过行,而是检查和跳过字符。

这样更好:

  int lines = array.length / 10;
  for (int i = 0; i<= lines / 2; i++){
      for (int j = 0; j < 10; j++) {
          char t = array[i * 10 + j];
          array[i * 10 + j] = array[(lines - i - 1) * 10 + j];
          array[(lines - i - 1) * 10 + j] = t;
      }
  }

答案 1 :(得分:1)

你的逆转有点困惑....如果你在两个循环中这样做会更容易。

for (int row = 0; row < (array.Length / 10); row++)
{
    for (int col = 0; col < 5; col++)
    {
        int rowStart = row * 10;
        int rowEnd = rowStart + 9;
        char temp = array[rowStart + col];                    
        array[rowStart + col] = array[rowEnd - col];
        array[rowEnd - col] = temp;
    }
}

答案 2 :(得分:0)

所以..

首先,首先打印'#'而不是' ',然后打印'.'而不是'#'。你会更清楚地看到发生了什么。

其次,你反而遇到问题,你实际上没有反转任何东西,你计算索引lines - i - 1的方式是错误的。好方法是(i / 10) * 10 + (10 - (i % 10)) -1。是的,有点可怕,但如果你想在一行中使用一维数组,就可以了。现在由您来理解它,并将其集成到您的代码中;)