#android #arrays #string #list #double
#Android #массивы #строка #Список #двойной
Вопрос:
Я работаю с achartengine в своем приложении. Они добавили функцию для обработки нулевых значений, но для их правильной обработки вам нужно, чтобы MathHelper.NULL_VALUE находился на месте нулевого значения. Для правильного отображения данных графу необходим список Double[] (список двойных массивов). Мой код перебирает курсор, заполняет список двойников, преобразует список двойников в Double[] затем, наконец, добавляет Double[] в мой список Double[] .
Я попытался ввести в цикл оператор if / else, в котором говорится, что если column_TEMP равно null, то cvalue=MathHelper.NULL_VALUE, но он выполняет вычисления до того, как это необходимо, и результаты были довольно катастрофическими (сбой). График не заполнялся должным образом, имея одну маленькую строку в самом низу экрана, и показывал только 2 точки вместо 10. Он не может выполнять вычисления для MathHelper.NULL_VALUE до тех пор, пока он не окажется в списке Double[] . Я пытаюсь найти способ изменить значения null, когда он переходит от Double[] к List Double[] . Вот код, который я использую в настоящее время. Как есть, нулевые значения отображаются как 0 на графике. Графики, использующие большие числа, могут быть довольно запутанными, если есть одно нулевое значение. Вы могли бы перейти от нескольких сотен до 0 из ниоткуда, а затем снова вернуться к нескольким сотням. Любые предложения приветствуются.
private List<Double[]> values;
private List<Double> cValue;
private Double[] Dvalue;
while (cursor.moveToNext()) {
try {
String cdate=null;
Double cvalue=null;
column_date = cursor.getColumnIndex(Provider.DATE);
column_value = cursor.getColumnIndex(Provider.TEMP);
cdate = cursor.getString(column_date);
cvalue = cursor.getDouble(column_value);
};
SimpleDateFormat curFormater = new SimpleDateFormat("yyyy/MM/dd");
Date dateObj = curFormater.parse(cdate);
if (dateObj.getTime() >= startDate.getTime() amp;amp;
dateObj.getTime() <= endDate.getTime()) {
SimpleDateFormat postFormater = new SimpleDateFormat("yyyy,MM,dd");
String dateObj1 = postFormater.format(dateObj);
SimpleDateFormat finalFormater = new SimpleDateFormat("yyyy,MM,dd");
Date dateObj2 = finalFormater.parse(dateObj1);
cDates.add(dateObj2);
cValue.add(cvalue);
}
} catch (ParseException e) {
e.printStackTrace();
}
}
dateValues = cDates.toArray(new Date[0]);
dates.add(dateValues);
Dvalue = (Double[]) cValue.toArray(new Double[0]);
values.add(Dvalue);
Теоретически так должен выглядеть массив, но я понятия не имею, как ввести значение MathHelper.NULL_VALUE в существующий массив.
values.add(new double[] { 21.2, 21.5, 21.7, 21.5, 21.4, 21.4, 21.3, 21.1, 20.6, 20.3, 20.2,
19.9, 19.7, 19.6, 19.9, 20.3, 20.6, 20.9, 21.2, 21.6, 21.9, 22.1, 21.7, 21.5 });
values.add(new double[] { 1.9, 1.2, 0.9, 0.5, 0.1, -0.5, -0.6, MathHelper.NULL_VALUE,
MathHelper.NULL_VALUE, -1.8, -0.3, 1.4, 3.4, 4.9, 7.0, 6.4, 3.4, 2.0, 1.5, 0.9, -0.5,
MathHelper.NULL_VALUE, -1.9, -2.5, -4.3 });
Редактировать:
Я разобрался с одной проблемой. В моем цикле while я помещаю этот код
Double d=MathHelper.NULL_VALUE;
String s=Double.toString(d);
Log.i(getClass().getSimpleName(), s);
и он регистрирует 0.0, но ниже по моим настройкам chartfactory (вне цикла) Я ввел тот
же код, и он вернул 1.7976931348623157E308, как и ожидалось. Почему
цикл while приводит к возвращению 0.0?
Комментарии:
1. В стороне: наличие переменных с именами
cvalue
иcValue
в той же области довольно подвержено ошибкам.2. Я согласен, что обычно это так, но мне легче перейти от двойного к списку<Double> . Мой мозг просто не в порядке, я думаю, лол.
3. Как насчет
cValue
противcValues
или дажеcValueList
?cValue
versuscValue
ничего не говорит о том, что в них отличается.4. Это определенно было бы лучше. Я уберу это, как только заработает окончательный код. Спасибо 🙂
Ответ №1:
Неясно, что вы имели в виду при добавлении оператора if, потому что вы не включили код, а «результаты были довольно катастрофическими (сбой)» не очень конкретны — сообщение об ошибке было бы полезно.
В любом случае, вот что я ожидаю от работы, учитывая предоставленную информацию:
Измените это:
cValue.add(cvalue);
в это:
cValue.add(cvalue == null ? MathHelper.NULL_VALUE : cvalue);
Несколько предложений, не имеющих прямого отношения к вашей проблеме:
-
У меня нет переменных в одной и той же области, имя которых отличается только регистром одной внутренней буквы.
FooBar
versusfooBar
— это нормально (хотяFooBar
в Java должно быть имя класса, а не переменная), ноfoobar
versusfooBar
слишком легко перепутать. -
Я не знаю, почему у вас есть Dvalue и cValue в качестве полей. Похоже, они просто содержат временные значения, поэтому локальные значения были бы более подходящими.
-
В Java стандартным соглашением является то, что только классы имеют имена, подобные
Dvalue
. Переменная должна начинаться со строчной буквы. (исключением, в зависимости от вашего определения «переменной», являются константы, которые все являются заглавными буквами с подчеркиваниемLIKE_THIS
) -
Массив нулевой длины неизменяем в Java, поэтому нет никакого смысла иметь более одного данного типа. Вы можете просто сохранить их в константах (т. Е.
static final
В полях) и использовать их повторно. В качестве альтернативы, в этом случае вы знаете длину нужного массива, поэтому вы можете просто выделить массив нужного размера перед вызовомtoArray
.
Комментарии:
1. Во-первых, спасибо за всю информацию. Cvalue и cValue используются только в этой одной области, поэтому, как только он будет передан, мне не нужно беспокоиться о том, чтобы их перепутать. Я понимаю, что вы говорите. Я не знаю, почему я использовал Dvalue вместо dValue, вероятно, я просто устал и в тот день ввел его с ошибкой. Я вернусь и уберу :). Размер массива всегда меняется в зависимости от того, сколько раз люди записывали временные значения в базу данных. Также в списке массивов может быть только один массив, но их может быть до 4.
2. Я попробовал cValue.add(cvalue == null ? MathHelper.NULL_VALUE : cvalue); но он сделал то же самое, что и раньше, где нулевые значения просто отображаются как 0, а не как пустые.
Ответ №2:
Хорошо, значение, отображаемое как 0.0, было ошибкой ID10T. у глупого меня была string = вместо string.equals . Основная проблема заключалась в том, что ему не нравилось передавать MathHelper.NULL_VALUE в исходном списке как Double . Что мне нужно было сделать, так это передать все в виде строки в список строк, затем добавить это в массив строк и, наконец, я передал это в список массивов строк. Как только у меня было все в списке строковых массивов, мне пришлось придумать новый код для преобразования списка строковых массивов в список двойных массивов, и это сработало идеально.
Спасибо за помощь, Лоуренс 🙂