我有一个字符串,我想通过按行加载到2D数组然后按列打印数据来加密。这样:
加密到“ACEBD”。
但是我似乎无法避免在输出的最后一行中删除“ACBD”中的字符。知道如何解决这个问题吗?
public static void main(String[] args) throws FileNotFoundException {
if (handleArguments(args))
System.out.println("encrypt");
// get input
Scanner input = new Scanner(inputFile);
String line = input.nextLine();
// calculate height of the array
int height = line.length() / width;
// Add one to height if there's a partial last row
if (line.length() % width != 0)
height += 1;
loadUnloadGrid(line, width, height);
}
static void loadUnloadGrid(String line, int width, int height) {
// make an empty array
char grid[][] = new char[height][width];
// fill the array row by row with character from line
int charCount = 0;
for (int r = 0; r < height - 1; r++) {
for (int c = 0; c < width; c++) {
// check to make sure accessing past end of the line
if (charCount < line.length()) {
grid[r][c] = line.charAt(charCount);
charCount++;
}
}
}
// print to standard output the characters in array
System.out.printf("Grid width %d: \"", width);
for (int r = 0; r < width; r++) {
for (int c = 0; c < height; c++) {
System.out.print(grid[c][r]);
}
}
// !!Special handling for last row!!
int longColumn = line.length() % width;
if (longColumn == 0)
longColumn = width;
for (int c = 0; c < longColumn; c++) {
System.out.print(grid[height - 1][c]);
}
System.out.println();
}
答案 0 :(得分:0)
您需要在循环列之前循环行,即,就像您通常不这样做的那样。
for (int i = 0; i < array[0].length; i++) {
for (int j = 0; j < array.length; j++) {
// prints columns before rows
}
}
但是,请注意,您无法检查循环中一行的列数是否少于另一行。通常array[i].length
可以避免任何NPE。在这种情况下,您可能需要定义检查行j
处的数组是否具有列i
。这可以通过检查:
if (array[j].length > i)
// System.out.println(...);
else
break;
编辑:我看到你的循环应该正常工作。最有可能height
只是1
而不是2
,因此,最后一行会被切断。我的代码适用于您的输入,您的循环应该以相同的方式工作。尝试打印height
并检查它是否正确或调试您的程序并逐步完成。