1

我有 3 个长值变量timestamp1 timestamp2 timestamp3和一个 arraylist 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
     .
     .
     .
}

现在在 else 中,如果我想检查三个时间戳并获取具有最小值的变量,而不是值本身。因为我需要在代码中进一步使用其他变量的变量。当然,我也想将最小值添加到列表中。我可以想象,我可以在 else 中做更多的 if/else 分支

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

但这太过分了,肯定有更好的方法。

4

4 回答 4

0

试试这个:

    long timestamp1 = 1;
    long timestamp2 = 2;
    long timestamp3 = 3;
    long result = LongStream.of(timestamp1, timestamp2, timestamp3)
            .min()
            .getAsLong();
于 2018-09-04T09:33:14.753 回答
0

在 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
于 2018-09-04T10:11:02.570 回答
0

将变量保持在某个值的另一种方法是使用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());
于 2018-09-04T10:29:05.690 回答
0

所以我采用了@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);

我在我的问题中提到我需要该变量以供以后使用。这是因为我需要变量的名称来减少特定主机的计数变量。(eafed ......是主机)。

感谢所有的答案!

于 2018-09-04T11:49:23.493 回答