如何将整数数组中的数字重新对齐到 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 列)。

  1. 如果 0 <= number < 5,我会称他们为“小”号;
  2. 如果5 <= number < 10,我会称他们为“大”号;
  3. 如果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.printSystem.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] = 3yourArray[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);
}