Android заменяет нули в моем списке двойных массивов

#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 versus cValue ничего не говорит о том, что в них отличается.

4. Это определенно было бы лучше. Я уберу это, как только заработает окончательный код. Спасибо 🙂

Ответ №1:

Неясно, что вы имели в виду при добавлении оператора if, потому что вы не включили код, а «результаты были довольно катастрофическими (сбой)» не очень конкретны — сообщение об ошибке было бы полезно.

В любом случае, вот что я ожидаю от работы, учитывая предоставленную информацию:

Измените это:

 cValue.add(cvalue);
  

в это:

 cValue.add(cvalue == null ? MathHelper.NULL_VALUE : cvalue);
  

Несколько предложений, не имеющих прямого отношения к вашей проблеме:

  • У меня нет переменных в одной и той же области, имя которых отличается только регистром одной внутренней буквы. FooBar versus fooBar — это нормально (хотя FooBar в Java должно быть имя класса, а не переменная), но foobar versus fooBar слишком легко перепутать.

  • Я не знаю, почему у вас есть 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 . Что мне нужно было сделать, так это передать все в виде строки в список строк, затем добавить это в массив строк и, наконец, я передал это в список массивов строк. Как только у меня было все в списке строковых массивов, мне пришлось придумать новый код для преобразования списка строковых массивов в список двойных массивов, и это сработало идеально.

Спасибо за помощь, Лоуренс 🙂