Android заменяет нули в моем списке двойных массивов - PullRequest
0 голосов
/ 03 ноября 2011

Я работаю с achartengine в моем приложении. Они добавили функцию для обработки нулевых значений, но для их правильной обработки необходимо, чтобы MathHelper.NULL_VALUE находился вместо нулевого значения. График нуждается в List Double [] (список двойных массивов), чтобы правильно отображать данные. Мой код проходит по курсору, заполняет список пар, преобразует список пар в Double [], а затем добавляет Double [] в мой список Double [].

Я попытался поместить оператор if / else в цикл, говоря, что если column_TEMP имеет значение null, то cvalue = MathHelper.NULL_VALUE, но он выполняет вычисления до того, как это необходимо, и результаты были довольно катастрофическими (не удалось). График не заполнялся должным образом, имея одну маленькую линию в самом низу экрана, и отображал только 2 точки вместо 10. Он не может выполнять вычисления для MathHelper.NULL_VALUE до тех пор, пока он не окажется в двойном списке []. Я пытаюсь найти способ изменить нулевые значения, когда он переходит из Double [] в List Double []. Вот код, который я сейчас использую. Как есть, нулевые значения отображаются на графике как 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() && 
                        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 });

Edit:

Я понял одну проблему. В моем цикле while я поместил этот код

            Double d=MathHelper.NULL_VALUE; 
            String s=Double.toString(d); 
            Log.i(getClass().getSimpleName(), s);

и он записывает 0.0, но ниже, в соответствии с моими настройками диаграммы (вне цикла), я помещаю тот же код, и он вернул 1.7976931348623157E308, как и ожидалось. Зачем будет ли цикл while возвращать 0.0?

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

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

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

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

cValue.add(cvalue);

на это:

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

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

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

  • Я не знаю, почему у вас есть поля Dvalue и cValue.Похоже, они просто содержат временные значения, поэтому более подходящими были бы локальные.

  • В Java стандартное соглашение состоит в том, что только классы имеют имена, такие как Dvalue.Переменная должна начинаться со строчной буквы.(исключение, в зависимости от вашего определения «переменной», это константы, которые являются заглавными буквами с подчеркиванием LIKE_THIS)

  • Массив нулевой длины является неизменным в Java, поэтому нетне имеет смысла иметь более одного данного типа.Вы можете просто хранить их в константах (то есть: static final поля) и использовать их повторно.Кроме того, в этом случае вы знаете длину нужного массива, поэтому вы можете просто выделить массив нужного размера перед вызовом toArray.

0 голосов
/ 04 ноября 2011

Хорошо, значение, показанное как 0.0, было ошибкой ID10T. глупо у меня была строка = вместо string.equals. Однако главная проблема заключалась в том, что ему не нравилось передавать MathHelper.NULL_VALUE в исходном списке как Double. Что мне нужно было сделать, это передать все как строку в список строк, затем добавить это в массив строк, и, наконец, я передал это в список массивов строк. Как только у меня было все в списке строковых массивов, мне пришлось придумать новый код для преобразования списка строковых массивов в список двойных массивов, и он работал отлично.

Спасибо за помощь Laurence:)

...