Проблема уже обсуждалась в stackoverflow, я специально спрашиваю мнение или ответы относительно моего кода и может ли он работать с несбалансированными 2D-массивами без капитального ремонта. Причина, по которой он не печатает конец некоторых сбалансированных массивов должен быть какой-то меньшей проблемой. Обновление внизу
По сути, у нас есть двумерный массив, предоставляемый текстовым файлом, управляемым из командной строки. В этом файле каждое испытание отделено новой строкой и выглядит следующим образом: строки; столбцы; значения (разделенные пробелами).
Пример: 4;4;1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Выход: 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package spiralprinting;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
*
* @author Paul
*/
public class SpiralPrinting {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws FileNotFoundException, IOException {
// TODO code application logic here
File file = new File(args[0]);
BufferedReader in = new BufferedReader(new FileReader(file));
String line;
while ((line = in.readLine()) != null) {
String[] lineArray = line.split(";");
if (lineArray.length > 0) {//ignore blank line inputs
//Process line of input Here
//Max ,minimum, and current indexes in our matrix.
int maxX = Integer.parseInt(lineArray[0]) - 1;
int maxY = Integer.parseInt(lineArray[1]) - 1;
int minX = 0;
int minY = 0;
int x = 0;
int y = 0;
//Build our matrix
String[] valueArray = lineArray[2].split("\\s");
String[][] matrix = new String [Integer.parseInt(lineArray[0])][Integer.parseInt(lineArray[1])];
int count = 0;
for (int j = 0; j <= maxY; j++){
for (int i = 0; i <= maxX; i++){
matrix[i][j] = (valueArray[count]);
count++;
}
}
StringBuilder printString = new StringBuilder();
//Traverse and print our matrix in a spiral!
while (maxX > minX && maxY > minY){
//Leaving this in and commented so you can see my train of thought.
if (x != maxX){
while (x < maxX){
printString.append(matrix[x][y]).append(" ");
x++;
}maxX--;
}
if (y != maxY){
while (y < maxY){
printString.append(matrix[x][y]).append(" ");
y++;
}maxY--;
}
if (x != minX){
while (x > minX){
printString.append(matrix[x][y]).append(" ");
x--;
}minX++;
}
if (y != minY){
while (y > minY){
printString.append(matrix[x][y]).append(" ");
y--;
}minY++;
}
//One border done (4 passes). Next iteration of while-loop begins.
x = minX;
y = minY;
}//end of our traversal loop
//Print it !
System.out.println(printString.toString().trim());
}
}//end of input line analysis
}
}//end of class
Пример ввода и текущего вывода:
4;4;1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ---> 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 хорошо
3;3;1 2 3 4 5 6 7 8 9 ---> 1 2 3 6 9 8 7 4 Не удается напечатать 5
3;4;1 2 3 4 5 6 7 8 9 10 11 12 ---> 1 2 3 6 9 12 11 10 7 4 .. не удается напечатать 5, 8 в конце... эм>
4;3;1 2 3 4 5 6 7 8 9 10 11 12 ---> 1 2 3 4 8 12 11 10 9 5 .. не удается снова напечатать последние 2: 6, 7"
2;10;1......20 ---> 1, 2, 4, 6, 8....хорошо
После некоторых быстрых изменений моя проблема заключается в том, что он не печатает последние 2 для некоторых наборов. Я убежден, что это особый случай, и я собираюсь спать на нем :)
Любая помощь по-прежнему приветствуется, особенно если вы считаете, что проблема серьезнее, чем я считаю в настоящее время. Мой сонный мозг думает, что мне нужно 2 особых случая, чтобы выполнить мои 4 проверки в цикле while...
Спасибо =]