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

求助:将ArrayList<Double>转换为double基本类型数组

问题分析与解决方案

首先得说,你的问题其实分为两个层面:DBHelper中获取数据的逻辑有问题,以及数组转换和打印的用法错误,咱们一步步来解决:


1. 先修复getLastEntry()的逻辑bug

你当前的方法里,while(cursor.moveToNext())嵌套if(cursor.moveToLast())的逻辑完全是冗余的,甚至会导致数据获取异常。cursor.moveToLast()会直接定位到结果集的最后一行,根本不需要在循环里反复判断。修改后的方法如下:

public ArrayList<Double> getLastEntry(){
    ArrayList<Double> data = new ArrayList<Double>();
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.query(TABLE_NAME, new String[]{COL2}, null, null, null, null, null);
    
    // 直接定位到最后一行,存在则添加数据
    if(cursor.moveToLast()){
        Double add = cursor.getDouble(0);
        data.add(add);
    }
    
    cursor.close();
    return data;
}

这样修改后,你才能保证拿到的是结果集最后一行的正确数据,后续的数组转换才有意义。


2. 解决第一种转换方法的打印问题

你看到的“乱码符号”其实不是乱码,是Java数组默认toString()方法输出的对象哈希值(比如[D@1234abcd这种格式)。要打印数组的实际内容,必须用Arrays.toString()方法。修改后的代码:

ArrayList<Double> data = mDatabaseHelper.getLastEntry();
double []arrX = new double [data.size()];
for(int j=0; j<data.size();j++){
    arrX[j] = data.get(j); // 不需要额外的convert变量,直接赋值即可
}
// 用Arrays.toString打印数组内容,记得导入java.util.Arrays
Log.d(TAG, Arrays.toString(arrX));

3. 解决第二种Stream转换方法的错误

你写的data = new ArrayList<>(Arrays.asList(data));这行是完全错误的:Arrays.asList(data)会把整个ArrayList<Double>当成单个元素,生成一个List<ArrayList<Double>>,后续Stream自然无法推断类型,导致cannot infer arguments错误。直接去掉这行冗余代码即可:

ArrayList<Double> data = mDatabaseHelper.getLastEntry();
double[] arr = data.stream().mapToDouble(Double::doubleValue).toArray();
// 同样用Arrays.toString打印内容
Log.d(TAG, Arrays.toString(arr));

注意:如果你的Android项目API版本低于24,Stream API是不支持的,这时候第一种循环转换的方法兼容性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:47:32