如何将Vector<Vector>转为String数组/String[][]并清理JTable未使用点
解决方案
你原来的代码无效的核心原因:data是Vector<Vector>类型,调用contains(pn)时,是在判断这个大Vector里是否存在整个元素等于pn字符串的项,但实际每个元素都是存了七列数据的子Vector,自然匹配不到。
解决思路
先把Lines表中所有可能出现点名称的单元格内容提取出来,存入HashSet(查找效率远高于嵌套循环),之后直接用Set的contains()方法快速判断点是否被使用,避免嵌套循环。
修改后的代码
btnDeleteUnused.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 1. 提取Lines表所有内容到HashSet,用于快速查找 Set<String> linePoints = new HashSet<>(); int lineRows = linesTableModel.getRowCount(); int lineCols = linesTableModel.getColumnCount(); for (int i = 0; i < lineRows; i++) { for (int j = 0; j < lineCols; j++) { Object cellValue = linesTableModel.getValueAt(i, j); if (cellValue instanceof String) { linePoints.add((String) cellValue); } } } // 2. 从后往前遍历Points表,删除未被使用的点 for(int k = pointsTableModel.getRowCount() - 1; k >= 0; k--) { String currentPoint = (String) pointsTableModel.getValueAt(k, 0); System.out.println("Current Point: "+ currentPoint); if (!linePoints.contains(currentPoint)) { pointsTableModel.removeRow(k); System.out.println("Deleted unused point: " + currentPoint); } } } });
关键说明
- HashSet的优势:
contains()方法时间复杂度为O(1),比嵌套遍历Vector<Vector>效率高很多,尤其当数据量较大时更明显 - 从后往前遍历删除:避免删除行后,后续行的索引发生偏移导致漏删或错删
- 类型判断:添加
instanceof String检查,防止非字符串类型的单元格内容引发类型转换异常 - 可选优化:如果Lines表中只有特定列存储点名称(比如仅前两列),可以修改内层循环的列范围,减少不必要的遍历
内容的提问来源于stack exchange,提问作者Edelweiss Monville
相关产品推荐
相关产品推荐

