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

Android开发中如何实现Cursor仅选取值不重复的单元格

实现Cursor读取去重的方案

针对你需要跳过KEY_AREA列重复值、仅保留首次出现内容的需求,有两种可直接落地的实现方式,优先推荐数据库层面去重的方案,执行效率更高:

方案1:查询阶段直接返回去重结果(推荐)

直接在数据库查询时开启去重逻辑,返回的Cursor本身就不存在重复的KEY_AREA值,不需要额外写遍历判重代码,数据量越大性能优势越明显。
修改后的查询代码如下:

// 开启distinct去重,按KEY_AREA分组保证列值唯一
Cursor cursor = database.query(
        true,
        DBHelper.TABLE_AREA,
        columns,
        null,
        null,
        DBHelper.KEY_AREA,
        null,
        null,
        null
);

if (cursor.moveToFirst()) {
    do {
        Area_Names.add(cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.KEY_AREA)));
    } while (cursor.moveToNext());
} else {
    Log.d("mLog", "0 rows");
}
cursor.close();

方案2:遍历阶段内存判重(适配不能修改原查询的场景)

如果业务逻辑要求必须保留原查询的全量返回结果,就在遍历时用HashSet记录已经出现过的值,仅将首次出现的内容加入列表即可,完全匹配你举例的输出顺序:

// 记录已经出现过的区域值
HashSet<String> existedValues = new HashSet<>();
Cursor cursor = database.query(DBHelper.TABLE_AREA,
        columns,
        null,
        null,
        null,
        null,
        null,
        null);

if (cursor.moveToFirst()) {
    do {
        String currentValue = cursor.getString(cursor.getColumnIndexOrThrow(DBHelper.KEY_AREA));
        // add方法返回true代表值不存在,是首次出现
        if (existedValues.add(currentValue)) {
            Area_Names.add(currentValue);
        }
    } while (cursor.moveToNext());
} else {
    Log.d("mLog", "0 rows");
}
cursor.close();

该方案会严格按照Cursor的遍历顺序保留值的首次出现记录,你示例中重复的第二个Car、第二个Beer都会被直接跳过,最终得到的列表顺序就是Beer、Car、House、Tree,和预期完全一致。


内容的提问来源于stack exchange,提问作者Argaros

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:09:14