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

如何避免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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:40:10