Невозможно изменить значение переменной внутри массива

Я пытаюсь понять, как изменить DateToStr (время Unix), когда отображается элемент массива. В настоящее время всегда отображается одно и то же время.

public class Testarray {
    public static void main(String args[]) {
        SimpleDateFormat format = new SimpleDateFormat("yyMMddHHmmss");
        String  DateToStr = format.format(new Date());

        String[] anArray = {
            "001,"+ DateToStr +",,F,", "001,"+ DateToStr +",,F,", "001,"+ DateToStr +",,F,"
        };

        for (int i =0 ;i <anArray.length;i++) {
             try{
                 //  show array element every 10sc with new date and time. 
                 Thread.sleep(10000);
             }catch(InterruptedException ex){

             }
             System.out.println(anArray[i]);
        }
    }

Токовый выход:

001,181102074606,,F,
001,181102074606,,F,
001,181102074606,,F,

Ожидаемый результат: каждый вывод должен иметь новую дату, так как он задерживается на 10 секунд.

Вы никогда не меняете значение даты. Вы устанавливаете его только один раз.

user9420984 02.11.2018 09:26

Вы преобразуете текущую дату в строку один раз и только один раз перед циклом. Затем вы сохраняете это уникальное строковое значение три раза в массиве. Для изменения вывода вам нужно получить текущую дату и преобразовать ее в строку внутри цикла.

JB Nizet 02.11.2018 09:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Переменная DateToStr является общей для всех трех записей в массиве, поэтому каждый раз она дает вам одну и ту же дату. Если вы хотите, чтобы ваша дата каждый раз была новой, вам нужно будет получить это значение в цикле перед методом сна.

Попробуй это,

  SimpleDateFormat format = new SimpleDateFormat("yyMMddHHmmss");

        String[] anArray = new String[3];

        char c ='E';
        for (int i =0 ;i <anArray.length;i++) {

            try{
                anArray[i]= "001,"+ format.format(new Date()) +",,"+c+",";
                c++;
            //  show array element every 10sc with new date and time. 
                Thread.sleep(10000);
            }catch(InterruptedException ex){

            }

            System.out.println(anArray[i]);

        }

Спасибо, но есть одна проблема, внутри цикла for, как пройти три 3 цикла? потому что вы делаете это ниже, так как же пройти 2-й и 3-й этапы? anArray [i] = "001," + format.format (новая Дата ()) + ",, F,";

alammd 02.11.2018 10:32

Поскольку вы используете его внутри цикла, он автоматически запускается 3 раза и присваивает значение вашему 2-му и третьему элементу массива.

Pooja Aggarwal 02.11.2018 10:34

Спасибо, но откуда берутся значения 2-го и 3-го итераций? потому что мы вручную кодируем первую итерацию anArray [i] = "001," + format.format (new Date ()) + ",, F,"; откуда он получает 2 других элемента: ** "001," + DateToStr + ",, F," "001," + DateToStr + ",, F," **

alammd 02.11.2018 10:39

Итак, когда вы прогоните код всухую, он будет выглядеть следующим образом: i = 0, anArray [i] = "001" + новая форматированная дата + ",, F,". Теперь для второй итерации i = 1, anArray [i] = "001" + сформированная новая дата + ",, F", и здесь новая дата будет на 10 секунд впереди, поскольку мы переводим наш поток в спящий режим на 10 секунд. . и, наконец, i = 2, anArray [i] = "001" + сформированная новая дата + ",, F,".

Pooja Aggarwal 02.11.2018 10:42

Ах, я вижу, в чем путаница, эти 3 элемента - разные элементы, позвольте мне изменить код в основном разделе, чтобы прояснить, что эти 3 элемента разные, это будет так, просто для примера, я изменил символ E, F , G, чтобы показать другой элемент, а не тот же String [] anArray = {"001," + DateToStr + ",, E,", "001," + DateToStr + ",, F,", "001," + DateToStr + ",, G,"};

alammd 02.11.2018 10:46

это путаница, все же я не получил его в массиве, он имеет ** 3 разных элемента ** "001,"+ DateToStr +",,E,","001,"+ DateToStr +",,F,","001,"+ DateToStr +",,G,", но в цикле мы предоставляем только один элемент, так как я могу передать другие 2 элемента? или я неправильно понимаю?

alammd 02.11.2018 10:53

После изменения будут другие значения. Попробуйте этот код, как только сможете понять.

Pooja Aggarwal 02.11.2018 10:54

хорошо, я думаю, что всех запутал, позвольте мне закрыть этот вопрос как правильный ответ, я создам новый с правильными значениями, потому что реальные значения для элемента Array будут такими, как показано ниже String [] anArray = {"001," + DateToStr + ", F, 162948.00, A, 5153.68366, N, 00026.29111, W, 3.863, 136.93,, 1, ‌ 0,0.00% ,,;", "001," + DateToStr + ",, F, 163018.00, A , 5153.67529, N, 00026.27327, W, 8.855,121.16,, 1‌, 0,0.00% ,,; "," 001, "+ DateToStr +" ,, F, 163018.00, A, 5153.67529, N, 00026.27327, W, 9.855,121.16,, 2‌, 0,0.00% ,,; " };

alammd 02.11.2018 11:06

Позвольте нам продолжить обсуждение в чате.

Pooja Aggarwal 02.11.2018 11:18

Вам необходимо обновлять значение DateToStr каждый раз при вставке. И вставляешь сразу все. Вы читаете только с задержкой в ​​10 секунд.

Правильно - ждать 10 секунд между вставками и читать дату каждый раз во время вставки.

  SimpleDateFormat format = new SimpleDateFormat("yyMMddHHmmss");

    String[] anArray = new String[3];
    for(int i = 0; i < anArray.length; ++i) {
        try {
            // Sleep before inserting
            Thread.sleep(1000);
            // Insert with new value every time
            anArray[i] = "001,"+ format.format(new Date()) + ",,F,";
            System.out.println(anArray[i]);
        } catch (InterruptedException ex) {
        }
    }

Спасибо, но есть одна проблема, внутри цикла for, как пройти три 3 цикла? потому что вы делаете это ниже, так как же пройти 2-й и 3-й пункт? anArray [i] = "001," + format.format (новая Дата ()) + ",, F,";

alammd 02.11.2018 10:33

Другие вопросы по теме