求助:将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
相关产品推荐
相关产品推荐

