You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:36:06