Java:在列表中查找组合日
我试图计算旅行的持续时间(以天为单位),如下表所示(每个DepArr对象代表一次旅行,包括出发日和到达日)。 基本上,我想计算一次旅行的天数(arr dep),如果旅行N在旅行N+1的同一天到达,那么到达日期必须在两次旅行之间分开。如果出发与前一次行程以及N+2等行程共享,则此项同样有效(见以下示例)
我创建了以下代码来计算一次旅行的天数(如果出发/到达日期相同),但我无法使其工作,例如当到达日期与下一次出发日期相同时,如下面的示例D、E和F
有没有更优雅的管理方法? 谢谢
List<DepArr> personTrips = new ArrayList<DepArr>();
personTrips.add(new DepArr(2, 2)); // A. espected result = 1.00 --> 0.50 + 0.50
personTrips.add(new DepArr(3, 3)); // B. espected result = 0.66 --> 0.33 + 0.33
personTrips.add(new DepArr(3, 6)); // C. espected result = 3.33 --> 0.33 + 1.00 + 1.00 + 1.00
personTrips.add(new DepArr(7, 8)); // D. espected result = 1.50 --> 1.00 + 0.50
personTrips.add(new DepArr(8, 9)); // E. espected result = 1.00 --> 0.50 + 0.50
personTrips.add(new DepArr(9, 10)); // F. espected result = 0.75 --> 0.50 + 0.25
personTrips.add(new DepArr(10, 10)); // G. espected result = 0.50 --> 0.25 + 0.25
personTrips.add(new DepArr(10, 11)); // H. espected result = 1.25 --> 0.25 + 1.00
personTrips.add(new DepArr(12, 12)); // I. espected result = 1.00 --> 0.50 + 0.50
personTrips.add(new DepArr(13, 13)); // J. espected result = 0.66 --> 0.33 + 0.33
personTrips.add(new DepArr(13, 14)); // K. espected result = 1.33 --> 0.33 + 1.00
personTrips.add(new DepArr(15, 16)); // L. espected result = 2.00 --> 1.00 + 1.00
for (int i = 0; i < personTrips.size(); i++) {
DepArr personPrev = personTrips.get(i-1);
DepArr personThis = personTrips.get(i);
DepArr personNext = personTrips.get(i+1);
double base = personThis.getArr() - personThis.getDep();
double depQuote = 0.5;
double arrQoute = 0.5;
// dep this = arr this
if(personThis.getDep() == personThis.getArr()) {
base = base + depQuote + arrQoute;
}
// *** DEP
// dep this = arr this = dep next
if(personThis.getDep() == personThis.getArr() && personThis.getArr() == personNext.getDep()) {
base = base - 1 + 2 * (depQuote + arrQoute) / 3;
}
// dep this = dep prev = arr prev
if(personThis.getDep() == personPrev.getDep() && personPrev.getDep() == personPrev.getArr()) {
base = base + 1 * (depQuote + arrQoute) / 3;
}
// dep this = arr prev
if(personThis.getDep() == personPrev.getArr() && personThis.getDep() != personThis.getArr() && personPrev.getDep() != personPrev.getArr()) {
base = base + 1 * (depQuote + arrQoute) / 2;
}
// *** ARR
// arr this = dep next = arr next
if(personThis.getArr() == personNext.getDep() && personNext.getDep() == personNext.getArr()) {
base = base + 1 * (depQuote + arrQoute) / 3;
}
// dep this = arr this = arr prev
if(personThis.getDep() == personThis.getArr() && personThis.getDep() == personPrev.getArr()) {
base = base - 1 + 2 * (depQuote + arrQoute) / 3;
}
// arr this = dep next
if(personThis.getArr() == personNext.getDep() && personThis.getDep() != personThis.getArr() && personNext.getDep() != personNext.getArr()) {
base = base + 1 * (depQuote + arrQoute) / 2;
}
// *** DEP and ARR
// dep this = arr this = dep prev = arr prev
if(personThis.getDep() == personThis.getArr() && personThis.getDep() == personPrev.getArr() && personPrev.getDep() == personPrev.getArr()) {
base = base - 1 + 2 * (depQuote + arrQoute) / 4;
}
// dep this = arr this = dep next = arr next
if(personThis.getDep() == personThis.getArr() && personThis.getArr() == personNext.getDep() && personNext.getDep() == personNext.getArr()) {
base = base - 1 + 2 * (depQuote + arrQoute) / 4;
}
Double usage = base;
log.info(i + " " + personThis.getDep() + " " + personThis.getArr() + " " + usage);
}
# 1 楼答案
我建议两件事
Trip
Date of departure
,Date of arrival
,Duration
李>isAfter
,isBefore
,getDay
等等李>如果
getDayOfYear
,getYear
返回相同的结果,您可以决定两天是否相等(不知道是否有内置方法可以为您执行此操作)这样你就可以轻松地比较两个日期,并计算持续时间
LocalDateTime是你在这里最大的盟友。当然,你可以检查Javadoc上的所有类和方法
# 2 楼答案
建立一个
Map
来计算每一天的频率这样一来
DepArr
对象的顺序就无关紧要了,它大大简化了代码例如,像这样,使用Java 8流:
输出