有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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);
}

共 (2) 个答案

  1. # 1 楼答案

    我建议两件事

    1. 制作一个有3个字段的类TripDate of departureDate of arrivalDuration
    2. 上述领域的获得者。(不需要设置器。该值将在构造函数上提供,除非持续时间由您计算)
    3. 用户LocalDateTime及其非常有用的方法,isAfterisBeforegetDay等等

    如果getDayOfYeargetYear返回相同的结果,您可以决定两天是否相等(不知道是否有内置方法可以为您执行此操作)

    这样你就可以轻松地比较两个日期,并计算持续时间

    LocalDateTime是你在这里最大的盟友。当然,你可以检查Javadoc上的所有类和方法

  2. # 2 楼答案

    建立一个Map来计算每一天的频率

    这样一来DepArr对象的顺序就无关紧要了,它大大简化了代码

    例如,像这样,使用Java 8流:

    Map<Integer, Long> dayFreq = personTrips.stream()
            .flatMap(t -> Stream.of(t.getDep(), t.getArr()))
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
    for (DepArr trip : personTrips) {
        double days = 1.0 / dayFreq.get(trip.getDep())
                    + 1.0 / dayFreq.get(trip.getArr());
        if (trip.getArr() > trip.getDep())
            days += trip.getArr() - trip.getDep() - 1;
        System.out.printf("%2s %2d %.2f%n", trip.getDep(), trip.getArr(), days);
    }
    

    输出

     2  2 1.00
     3  3 0.67
     3  6 3.33
     7  8 1.50
     8  9 1.00
     9 10 0.75
    10 10 0.50
    10 11 1.25
    12 12 1.00
    13 13 0.67
    13 14 1.33
    15 16 2.00