сравните три переменные и верните переменную с минимальным / максимальным значением (не значением) - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть 3 переменные с длинными значениями timestamp1 timestamp2 timestamp3 и массив timestampList. Я хочу сравнить их в if / else. Вполне возможно, что три метки времени имеют разные значения, поэтому я хочу добавить в список значения с минимальным значением. Следует также отметить, что эти временные метки появляются каждые 2 минуты.

Когда три переменные совпадают, я мог бы просто сделать

if(timestamp1 == timestamp2 && timestamp2 == timestamp3){
     timestampList.add(timestamp 1);   //since they are the same it doesn't matter which i add to the list
     .
     .
     .
}

теперь в другом или другом, если я хочу проверить три метки времени и получить переменную со значением min, а не само значение. Потому что мне нужна переменная для других переменных далее в коде. Конечно, я также хочу добавить значение min в список. Я могу себе представить, что я мог бы сделать больше, если / else разветвляется в else как

else{
     if(timestamp1 < timestamp2){
          if(timestamp1 < timestamp3){
               ...
          }else{
               ...
          }
     }
}

но это было бы слишком много, и, конечно, есть лучший способ.

Ответы [ 4 ]

0 голосов
/ 04 сентября 2018

Итак, я пошел с идеей @Amadan и создал массив с метками времени. Но немного подумав, я пришел к выводу, что это возможно без получения переменной.

long[] arrayDo = new long[3];
        arrayDo[0] = eafedo5.getServiceInformation(eafedo5Count).getTimestamp();
        arrayDo[1] = eafedo6.getServiceInformation(eafedo6Count).getTimestamp();
        arrayDo[2] = eafedo7.getServiceInformation(eafedo7Count).getTimestamp();

Затем я вычисляю minValue массива.

long minTimestamp = Math.min(arrayDo[0],Math.min(arrayDo[1],arrayDo[2]));

Тогда я спрашиваю, равны ли метки времени minValue

if(!timestamps.contains(minTimestamp)){
            timestamps.add(minTimestamp);
        }

        if(eafedo5.getServiceInformation(eafedo5Count).getTimestamp() ==minTimestamp){
            for(CHostNeighbor n : hostNeighborsEafedo5){
                msgsCountDo += n.getInboundMsgs();
            }
            eafedo5Count--;
        }
        if(eafedo6.getServiceInformation(eafedo6Count).getTimestamp() ==minTimestamp){
            for(CHostNeighbor n : hostNeighborsEafedo6){
                msgsCountDo += n.getInboundMsgs();
            }
            eafedo6Count--;
        }
        if(eafedo7.getServiceInformation(eafedo7Count).getTimestamp() ==minTimestamp){
            for(CHostNeighbor n : hostNeighborsEafedo7){
                msgsCountDo += n.getInboundMsgs();
            }
            eafedo7Count--;
        }

        msgsDo.add(msgsCountDo);

Я упомянул в своем вопросе, что мне нужна переменная для последующих целей. Это потому, что мне нужно было имя переменной, чтобы уменьшить переменную count конкретного хоста. (eafed ... являются хозяевами).

Спасибо за все ответы!

0 голосов
/ 04 сентября 2018

Вы не можете действительно получить «указатель» на переменную в Java, как вы могли бы в C. Самая близкая вещь будет использовать вместо этого изменяемый тип, поэтому вместо присвоения нового значения переменной вы можете изменить атрибут существующего экземпляра, и это изменение будет отражено в любом другом месте вашего кода, где у вас есть ссылка на этот экземпляр.

Например, вы можете заключить ваши long временные метки в AtomicLong экземпляров:

// wrap in mutable AtomicLong instances
AtomicLong timestamp1 = new AtomicLong(123);
AtomicLong timestamp2 = new AtomicLong(456);
AtomicLong timestamp3 = new AtomicLong(789);

// get minimum or maximum, using streams or any other way
AtomicLong minTimeStamp = Stream.of(timestamp1, timestamp2, timestamp3)
        .min(Comparator.comparing(AtomicLong::get)).get();

// modify value
System.out.println(minTimeStamp); // 123
timestamp1.set(1000);             // change original variable
System.out.println(minTimeStamp); // 1000
0 голосов
/ 04 сентября 2018

Другой способ сохранить переменную до определенного значения - использовать Optional<Long> в качестве @tobias_k, упомянутого в его комментарии. Альтернативой Stream будет использование TreeSet. При создании TreeSet мы предоставляем Function для сравнения элементов. После добавления всех временных меток мы можем вызвать TreeSet.first(), чтобы получить минимальный элемент.

List<Optional<Long>> timestamps = Arrays.asList(Optional.of(1234l), Optional.of(2345l), Optional.of(1234l));
TreeSet<Optional<Long>> setOfTimestamps = new TreeSet<>(Comparator.comparing(Optional::get));
setOfTimestamps.addAll(timestamps);

Optional<Long> min = setOfTimestamps.first();
System.out.println(min.get());
0 голосов
/ 04 сентября 2018

Попробуйте это:

    long timestamp1 = 1;
    long timestamp2 = 2;
    long timestamp3 = 3;
    long result = LongStream.of(timestamp1, timestamp2, timestamp3)
            .min()
            .getAsLong();
...