如何将整数数组中的数字重新对齐到 Jtable?
How to realign numbers from an Integer array to a Jtable?
抱歉表达不当让人困惑,我重新编辑问题。
有一个整数数组,它包含29个数字,这29个数字由0到10组成。
例如:整数 [ ] num ={ 0,3,4,5,6,1,3,10,4,3,1,0,2,2,3,4,1,0, 8,7,6,6,5,8,9,0,5,10,8} 我想将这些数字重新排列到 Jtable 中(限制 6 行,10 列)。
- 如果 0 <= number < 5,我会称他们为“小”号;
- 如果5 <= number < 10,我会称他们为“大”号;
- 如果number = 10,我会称他们为“P”number。
总之,这29个号码由3种号码("小"、"大"、"P")组成。
在数组num中,我们可以看到前三个数字属于“小”数,所以它们在c1中一个一个显示,第四个是5,它是“大”数,所以它跳到下一列,进入c2 ,c1 的剩余单元将不再使用。如果相同类型的数字超过6,它将右转到下一个最近的单元格继续显示(见第二个示例图像)。其他数组数字是相同的逻辑,循环数组num然后根据数字类型显示数字表。
我在 Jtable 中想要的最终结果,你可以在下面看到我 post 的示例图像。任何人 post 的示例代码都会对我很有帮助,在此先感谢!
在第二张示例图片下方,红色下划线数字共有10个“小”数字超过6,因此请转到右侧最近的单元格继续显示。绿色下划线一共有7个“大”字,因为c6的第六格已经被占用,第五格后右转继续显示
我编写代码只是为了创建 6 x 10 int
矩阵。
这是我的许多测试之一的输出。
0 5 1 10 4 8 0 5 10 8
3 6 3 3 7
4 1 6
0 6
2 5 8 9
2 3 4 1 0
Oracle 有一个有用的教程 Creating a GUI With JFC/Swing,它将帮助您学习如何创建 Swing GUI。跳过 Netbeans 部分。
您需要使用 JTable
来显示您的矩阵。
在处理诸如创建矩阵之类的问题时,将其分解为多个步骤会很有帮助。继续将其分解为多个步骤,直到您可以对每个步骤进行编码。
这个任务太复杂了,我不得不打印调试输出以确保我正在取得进展。不要害怕在您的代码中放置许多 System.out.print
和 System.out.println
语句。您可以像我一样使用 DEBUG 布尔值来关闭额外的打印语句。
这是创建 6 x 10 矩阵的完整可运行代码。我没有检查超过 10 个值的子集。我把那个留给你了。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class RealignNumbers {
private static final boolean DEBUG = false;
public static void main(String[] args) {
RealignNumbers rn = new RealignNumbers();
int[] numbers = { 0, 3, 4, 5, 6, 1, 3, 10, 4, 3, 1, 0, 2, 2, 3, 4, 1, 0,
8, 7, 6, 6, 5, 8, 9, 0, 5, 10, 8 };
int[][] matrix = rn.realignNumbers(numbers);
printMatrix(matrix);
}
private static void printMatrix(int[][] matrix) {
for (int row = 0; row < matrix.length; row++) {
for (int column = 0; column < matrix[row].length; column++) {
if (matrix[row][column] >= 0) {
String display = String.format("%3d", matrix[row][column]);
System.out.print(display);
} else {
System.out.print(" ");
}
}
System.out.println();
}
}
public int[][] realignNumbers(int[] numbers) {
List<List<Integer>> matrixList = splitInput(numbers);
printList(matrixList);
int[][] matrix = fillMatrix(matrixList);
return matrix;
}
private List<List<Integer>> splitInput(int[] numbers) {
List<List<Integer>> matrixList = new ArrayList<>();
int number = numbers[0];
boolean isSmall = number < 5;
List<Integer> numberList = new ArrayList<>();
numberList.add(Integer.valueOf(number));
for (int index = 1; index < numbers.length; index++) {
if (numbers[index] == 10) {
// Finish prior List if exists
if (numberList.size() > 0) {
matrixList.add(numberList);
numberList = new ArrayList<>();
}
// Create numberList for 10
numberList.add(Integer.valueOf(numbers[index]));
matrixList.add(numberList);
// Start new List
numberList = new ArrayList<>();
} else {
boolean small = numbers[index] < 5;
if (isSmall == small) {
// Add number to List
numberList.add(Integer.valueOf(numbers[index]));
} else {
// Number is different; end list and start new List
matrixList.add(numberList);
numberList = new ArrayList<>();
numberList.add(Integer.valueOf(numbers[index]));
isSmall = small;
}
}
}
if (numberList.size() > 0) {
matrixList.add(numberList);
}
return matrixList;
}
private void printList(List<List<Integer>> matrixList) {
if (DEBUG) {
int count = 1;
for (List<Integer> numberList : matrixList) {
String display = String.format("%2d", count++);
System.out.print("List " + display + " ");
for (int number : numberList) {
display = String.format("%3d", number);
System.out.print(display);
}
System.out.println();
}
}
}
private int[][] fillMatrix(List<List<Integer>> matrixList) {
int masterColumn = -1;
int length = 6;
boolean firstTimeSwitch = true;
int[][] matrix = new int[length][10];
for (int[] row : matrix) {
Arrays.fill(row, -1);
}
for (List<Integer> numberList : matrixList) {
masterColumn++;
int column = masterColumn;
int row = 0;
for (int number : numberList) {
if (DEBUG) {
System.out.println("row " + row + " column " + column);
}
matrix[row][column] = number;
// Check if we hit the last row
// If so, increment columns
if (row < (length - 1)) {
row++;
} else {
if (firstTimeSwitch) {
length--;
firstTimeSwitch = false;
}
column++;
}
}
if (length < 6) {
firstTimeSwitch = true;
}
}
return matrix;
}
}
如果你真的想这样做,那么可以把 jTable 想象成一个二维数组,例如 int[][] yourArray = new int[6][10];
.
因此,您列表中的第一个数字位于 yourArray[0][0] = 0
,接下来的两个数字位于同一列 yourArray[1][0] = 3
和 yourArray[2][0] = 4
,下一个数字 5 进入新列列 yourArray[0][1] = 5
等等。
因此,当谈到转向时,您可以在将数字放入 jTable 的循环中执行类似的操作:
if(row > rowCount) {
col++;
yourTableModel.setValueAt(number, row, col);
}
但要确保转弯时没有任何重叠,还可以使用:
//Insert value if able
if(yourTableModel.getValueAt(row, col) != null){
row++;
yourTableModel.setValueAt(number, row, col);
}
//Move to next col if not able to fit the number within the row
else{
col++;
yourTableModel.setValueAt(number, row, col);
}
抱歉表达不当让人困惑,我重新编辑问题。
有一个整数数组,它包含29个数字,这29个数字由0到10组成。
例如:整数 [ ] num ={ 0,3,4,5,6,1,3,10,4,3,1,0,2,2,3,4,1,0, 8,7,6,6,5,8,9,0,5,10,8} 我想将这些数字重新排列到 Jtable 中(限制 6 行,10 列)。
- 如果 0 <= number < 5,我会称他们为“小”号;
- 如果5 <= number < 10,我会称他们为“大”号;
- 如果number = 10,我会称他们为“P”number。
总之,这29个号码由3种号码("小"、"大"、"P")组成。
在数组num中,我们可以看到前三个数字属于“小”数,所以它们在c1中一个一个显示,第四个是5,它是“大”数,所以它跳到下一列,进入c2 ,c1 的剩余单元将不再使用。如果相同类型的数字超过6,它将右转到下一个最近的单元格继续显示(见第二个示例图像)。其他数组数字是相同的逻辑,循环数组num然后根据数字类型显示数字表。
我在 Jtable 中想要的最终结果,你可以在下面看到我 post 的示例图像。任何人 post 的示例代码都会对我很有帮助,在此先感谢!
在第二张示例图片下方,红色下划线数字共有10个“小”数字超过6,因此请转到右侧最近的单元格继续显示。绿色下划线一共有7个“大”字,因为c6的第六格已经被占用,第五格后右转继续显示
我编写代码只是为了创建 6 x 10 int
矩阵。
这是我的许多测试之一的输出。
0 5 1 10 4 8 0 5 10 8
3 6 3 3 7
4 1 6
0 6
2 5 8 9
2 3 4 1 0
Oracle 有一个有用的教程 Creating a GUI With JFC/Swing,它将帮助您学习如何创建 Swing GUI。跳过 Netbeans 部分。
您需要使用 JTable
来显示您的矩阵。
在处理诸如创建矩阵之类的问题时,将其分解为多个步骤会很有帮助。继续将其分解为多个步骤,直到您可以对每个步骤进行编码。
这个任务太复杂了,我不得不打印调试输出以确保我正在取得进展。不要害怕在您的代码中放置许多 System.out.print
和 System.out.println
语句。您可以像我一样使用 DEBUG 布尔值来关闭额外的打印语句。
这是创建 6 x 10 矩阵的完整可运行代码。我没有检查超过 10 个值的子集。我把那个留给你了。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class RealignNumbers {
private static final boolean DEBUG = false;
public static void main(String[] args) {
RealignNumbers rn = new RealignNumbers();
int[] numbers = { 0, 3, 4, 5, 6, 1, 3, 10, 4, 3, 1, 0, 2, 2, 3, 4, 1, 0,
8, 7, 6, 6, 5, 8, 9, 0, 5, 10, 8 };
int[][] matrix = rn.realignNumbers(numbers);
printMatrix(matrix);
}
private static void printMatrix(int[][] matrix) {
for (int row = 0; row < matrix.length; row++) {
for (int column = 0; column < matrix[row].length; column++) {
if (matrix[row][column] >= 0) {
String display = String.format("%3d", matrix[row][column]);
System.out.print(display);
} else {
System.out.print(" ");
}
}
System.out.println();
}
}
public int[][] realignNumbers(int[] numbers) {
List<List<Integer>> matrixList = splitInput(numbers);
printList(matrixList);
int[][] matrix = fillMatrix(matrixList);
return matrix;
}
private List<List<Integer>> splitInput(int[] numbers) {
List<List<Integer>> matrixList = new ArrayList<>();
int number = numbers[0];
boolean isSmall = number < 5;
List<Integer> numberList = new ArrayList<>();
numberList.add(Integer.valueOf(number));
for (int index = 1; index < numbers.length; index++) {
if (numbers[index] == 10) {
// Finish prior List if exists
if (numberList.size() > 0) {
matrixList.add(numberList);
numberList = new ArrayList<>();
}
// Create numberList for 10
numberList.add(Integer.valueOf(numbers[index]));
matrixList.add(numberList);
// Start new List
numberList = new ArrayList<>();
} else {
boolean small = numbers[index] < 5;
if (isSmall == small) {
// Add number to List
numberList.add(Integer.valueOf(numbers[index]));
} else {
// Number is different; end list and start new List
matrixList.add(numberList);
numberList = new ArrayList<>();
numberList.add(Integer.valueOf(numbers[index]));
isSmall = small;
}
}
}
if (numberList.size() > 0) {
matrixList.add(numberList);
}
return matrixList;
}
private void printList(List<List<Integer>> matrixList) {
if (DEBUG) {
int count = 1;
for (List<Integer> numberList : matrixList) {
String display = String.format("%2d", count++);
System.out.print("List " + display + " ");
for (int number : numberList) {
display = String.format("%3d", number);
System.out.print(display);
}
System.out.println();
}
}
}
private int[][] fillMatrix(List<List<Integer>> matrixList) {
int masterColumn = -1;
int length = 6;
boolean firstTimeSwitch = true;
int[][] matrix = new int[length][10];
for (int[] row : matrix) {
Arrays.fill(row, -1);
}
for (List<Integer> numberList : matrixList) {
masterColumn++;
int column = masterColumn;
int row = 0;
for (int number : numberList) {
if (DEBUG) {
System.out.println("row " + row + " column " + column);
}
matrix[row][column] = number;
// Check if we hit the last row
// If so, increment columns
if (row < (length - 1)) {
row++;
} else {
if (firstTimeSwitch) {
length--;
firstTimeSwitch = false;
}
column++;
}
}
if (length < 6) {
firstTimeSwitch = true;
}
}
return matrix;
}
}
如果你真的想这样做,那么可以把 jTable 想象成一个二维数组,例如 int[][] yourArray = new int[6][10];
.
因此,您列表中的第一个数字位于 yourArray[0][0] = 0
,接下来的两个数字位于同一列 yourArray[1][0] = 3
和 yourArray[2][0] = 4
,下一个数字 5 进入新列列 yourArray[0][1] = 5
等等。
因此,当谈到转向时,您可以在将数字放入 jTable 的循环中执行类似的操作:
if(row > rowCount) {
col++;
yourTableModel.setValueAt(number, row, col);
}
但要确保转弯时没有任何重叠,还可以使用:
//Insert value if able
if(yourTableModel.getValueAt(row, col) != null){
row++;
yourTableModel.setValueAt(number, row, col);
}
//Move to next col if not able to fit the number within the row
else{
col++;
yourTableModel.setValueAt(number, row, col);
}