比较三个变量并返回具有 min/max 值的变量(不是值)
compare three variables and get the variable with min/max value back (not value)
我有 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
.
.
.
}
现在在 else 中,否则如果我想检查三个时间戳并使用最小值而不是值本身获取 变量。因为我需要代码中其他变量的变量。当然,我也想将最小值添加到列表中。我可以想象,我可以在其他地方做更多 if/else 个分支,比如
else{
if(timestamp1 < timestamp2){
if(timestamp1 < timestamp3){
...
}else{
...
}
}
}
但这太过分了,肯定有更好的方法。
试试这个:
long timestamp1 = 1;
long timestamp2 = 2;
long timestamp3 = 3;
long result = LongStream.of(timestamp1, timestamp2, timestamp3)
.min()
.getAsLong();
你不能像在 C 中那样在 Java 中真正得到一个 "pointer" 到一个变量。最接近的是使用可变类型,而不是分配一个新值对于变量,您可以修改现有实例的属性,并且更改将反映在代码中您引用该实例的任何其他地方。
例如,您可以将 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
将变量保持为特定值的另一种方法是使用 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());
所以我接受了@Amadan 的想法并创建了一个包含时间戳的数组。但是稍微想了一下,得出的结论是,不获取变量也是可以的。
long[] arrayDo = new long[3];
arrayDo[0] = eafedo5.getServiceInformation(eafedo5Count).getTimestamp();
arrayDo[1] = eafedo6.getServiceInformation(eafedo6Count).getTimestamp();
arrayDo[2] = eafedo7.getServiceInformation(eafedo7Count).getTimestamp();
然后我计算数组的最小值。
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... 是主机)。
感谢大家的回答!
我有 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
.
.
.
}
现在在 else 中,否则如果我想检查三个时间戳并使用最小值而不是值本身获取 变量。因为我需要代码中其他变量的变量。当然,我也想将最小值添加到列表中。我可以想象,我可以在其他地方做更多 if/else 个分支,比如
else{
if(timestamp1 < timestamp2){
if(timestamp1 < timestamp3){
...
}else{
...
}
}
}
但这太过分了,肯定有更好的方法。
试试这个:
long timestamp1 = 1;
long timestamp2 = 2;
long timestamp3 = 3;
long result = LongStream.of(timestamp1, timestamp2, timestamp3)
.min()
.getAsLong();
你不能像在 C 中那样在 Java 中真正得到一个 "pointer" 到一个变量。最接近的是使用可变类型,而不是分配一个新值对于变量,您可以修改现有实例的属性,并且更改将反映在代码中您引用该实例的任何其他地方。
例如,您可以将 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
将变量保持为特定值的另一种方法是使用 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());
所以我接受了@Amadan 的想法并创建了一个包含时间戳的数组。但是稍微想了一下,得出的结论是,不获取变量也是可以的。
long[] arrayDo = new long[3];
arrayDo[0] = eafedo5.getServiceInformation(eafedo5Count).getTimestamp();
arrayDo[1] = eafedo6.getServiceInformation(eafedo6Count).getTimestamp();
arrayDo[2] = eafedo7.getServiceInformation(eafedo7Count).getTimestamp();
然后我计算数组的最小值。
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... 是主机)。
感谢大家的回答!