如何避免jTable因重复拉取JSON数据产生重复行?
避免JTable添加重复行的解决方案
方法1:基于唯一标识检查去重
找到业务上唯一区分每行的标识(比如bookTitle + chapterNumber的组合,或JSON自带的唯一ID),维护集合记录已添加的标识,每次获取新数据时先做检查:
// 全局/类级别维护已添加的唯一标识集合 private static HashSet<String> addedRowKeys = new HashSet<>(); // 处理新数据的逻辑 String uniqueKey = SharedData.bookTitle + "_" + SharedData.chapterNumber; if (!addedRowKeys.contains(uniqueKey)) { Object[] bookInfo = {SharedData.chapterTitle, SharedData.bookTitle, SharedData.chapterNumber, SharedData.volumeNumber, SharedData.translatedLanguage, SharedData.authName, SharedData.uploadedAt}; TablePanel.tableModel.addRow(bookInfo); addedRowKeys.add(uniqueKey); }
这种方式比遍历表格效率更高,集合检查为O(1)时间复杂度,适合数据量较大的场景。
方法2:直接遍历表格模型检查重复
如果无需额外维护集合,可直接遍历现有表格行,对比关键字段判断是否重复:
Object[] bookInfo = {SharedData.chapterTitle, SharedData.bookTitle, SharedData.chapterNumber, SharedData.volumeNumber, SharedData.translatedLanguage, SharedData.authName, SharedData.uploadedAt}; boolean isDuplicate = false; // 遍历表格所有行对比关键唯一字段 for (int i = 0; i < TablePanel.tableModel.getRowCount(); i++) { String existingBook = (String) TablePanel.tableModel.getValueAt(i, 1); String existingChapter = (String) TablePanel.tableModel.getValueAt(i, 2); if (SharedData.bookTitle.equals(existingBook) && SharedData.chapterNumber.equals(existingChapter)) { isDuplicate = true; break; } } if (!isDuplicate) { TablePanel.tableModel.addRow(bookInfo); }
方法3:优化数据拉取策略
从根源减少重复请求:
- 增量请求:若服务器支持,每次请求带上上次获取的最后更新时间,服务器仅返回该时间后更新的内容。
- 降低轮询频率:将每秒一次的轮询调整为更长间隔(如30秒、1分钟),减少不必要的重复请求。
- 改用推送机制:若服务器支持WebSocket或Server-Sent Events,让服务器在数据更新时主动推送,替代客户端轮询。
方法4:更新已有行而非重复添加
如果服务器JSON可能更新已有章节信息(如翻译语言、上传时间变化),可找到对应行更新数据,而非添加新行:
String uniqueKey = SharedData.bookTitle + "_" + SharedData.chapterNumber; boolean rowFound = false; for (int i = 0; i < TablePanel.tableModel.getRowCount(); i++) { String existingKey = TablePanel.tableModel.getValueAt(i, 1) + "_" + TablePanel.tableModel.getValueAt(i, 2); if (uniqueKey.equals(existingKey)) { // 更新该行的各字段 TablePanel.tableModel.setValueAt(SharedData.chapterTitle, i, 0); TablePanel.tableModel.setValueAt(SharedData.volumeNumber, i, 3); TablePanel.tableModel.setValueAt(SharedData.translatedLanguage, i, 4); TablePanel.tableModel.setValueAt(SharedData.authName, i, 5); TablePanel.tableModel.setValueAt(SharedData.uploadedAt, i, 6); rowFound = true; break; } } if (!rowFound) { Object[] bookInfo = {SharedData.chapterTitle, SharedData.bookTitle, SharedData.chapterNumber, SharedData.volumeNumber, SharedData.translatedLanguage, SharedData.authName, SharedData.uploadedAt}; TablePanel.tableModel.addRow(bookInfo); }
内容的提问来源于stack exchange,提问作者Bishop
相关产品推荐
相关产品推荐

