对象集合,对象属性有 startTime持仓开始时间,endTime持仓结束时间,对象包含的持仓时间有交集,用Java代码求总的持仓时间
时间: 2024-05-08 20:17:28 浏览: 74
可以使用以下代码求总的持仓时间:
```java
public static long getTotalHoldingTime(List<Position> positions) {
long totalHoldingTime = 0;
if (positions == null || positions.size() == 0) {
return totalHoldingTime;
}
// 按照持仓开始时间排序
Collections.sort(positions, Comparator.comparing(Position::getStartTime));
Position currPosition = positions.get(0);
for (int i = 1; i < positions.size(); i++) {
Position nextPosition = positions.get(i);
if (nextPosition.getStartTime() < currPosition.getEndTime()) {
// 如果下一个持仓的开始时间早于当前持仓的结束时间,说明存在交集
// 更新当前持仓的结束时间为下一个持仓的结束时间
currPosition.setEndTime(Math.max(currPosition.getEndTime(), nextPosition.getEndTime()));
} else {
// 否则,将当前持仓时间累加到总的持仓时间中,并更新当前持仓为下一个持仓
totalHoldingTime += currPosition.getEndTime() - currPosition.getStartTime();
currPosition = nextPosition;
}
}
// 最后一个持仓也要累加到总的持仓时间中
totalHoldingTime += currPosition.getEndTime() - currPosition.getStartTime();
return totalHoldingTime;
}
class Position {
private long startTime;
private long endTime;
public Position(long startTime, long endTime) {
this.startTime = startTime;
this.endTime = endTime;
}
public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
public long getEndTime() {
return endTime;
}
public void setEndTime(long endTime) {
this.endTime = endTime;
}
}
```
其中,`getTotalHoldingTime`方法接收一个持仓的列表,按照持仓开始时间排序,然后遍历列表中的所有持仓,如果发现当前持仓和下一个持仓存在交集,则更新当前持仓的结束时间为下一个持仓的结束时间;否则,将当前持仓时间累加到总的持仓时间中,并更新当前持仓为下一个持仓。最后,将最后一个持仓的时间也累加到总的持仓时间中,并返回总的持仓时间。
阅读全文