【问题标题】:compare elements of same array java比较相同数组java的元素
【发布时间】:2015-07-16 01:07:36
【问题描述】:

我正在为每周重复使用定期约会功能。我有一个开始日期、结束日期、重复开始日期、重复结束日期和选定的日期(周一、周二、周三、周四...周日)

这是一个例子

Start Date: 15th July 2015
End Date: 18th July 2015

Recurrence Start Date: 20th July 2015
Recurrence End Date: 20th August 2015

Recurrence frequency = weekly

Selected Days(Array storing int values for days_of_week with Sun as 1 and Sat as 7) = Mon, Wed, Sun 

根据要求,我需要创建这样的约会:-

Appointment 1 - 20th July 2015 (Mon) - 23rd July 2015(Thu)
............Appointment 2 - 22nd July 2015 (Wed)  - 25th July 2015(Sat)
............Appointment 3 - 26th July 2015 (Sun) - 29th July 2015(Wed)
............Appointment 4 - 27th July 2015 (Mon) - 30th July 2015(Thu)

但正如您所见,我需要防止出现重叠。我试图开发一种算法来防止这种重叠,而实际上并不知道实际的日子。

所以基本上没有区别。开始日期和结束日期之间的天数必须大于数组的两个连续索引之间的差。

我遇到了问题,因为Sun - Wed ( 1 - 4) 会给我一个负数,所以比较会小于结束日期和开始日期( end date - start date) 之间的天数差。

这是我到目前为止所做的:-

                        Calendar e = Calendar.getInstance();
                        Calendar f = Calendar.getInstance();
                        e.setTime(sStartDate);
                        f.setTime(estSignIn);

                        long diffInDays = ((estSignIn.getTime() - sStartDate.getTime()) 
                                / (1000 * 60 * 60 * 24) );


                        for(int j=0; j < localSelectedDays.length - 1 ; j++)
                        {   
                            e.set(Calendar.DAY_OF_WEEK, localSelectedDays[j]);
                            f.set(Calendar.DAY_OF_WEEK, localSelectedDays[j +1]);
                             int x = e.get(Calendar.DAY_OF_WEEK);
                             int y = f.get(Calendar.DAY_OF_WEEK);

                                 if ((y - x) <= diffInDays)
                                  { 
                                    System.out.println("ERROR" + "Y:" + y + "x" + x);
                                  }
                        }

【问题讨论】:

  • 你在问什么?你们约会之间有什么关系?你自己尝试过什么,你在哪里卡住了?

标签: java arrays calendar


【解决方案1】:

如果您只想要天数的差异,您可以使用 Math.abs()。

我个人不会将索引号用作算法的一部分,因为有一天您可能想更改数据结构,但这是主观的。

【讨论】:

    【解决方案2】:

    但正如您所见,我需要防止出现重叠。我曾是 试图开发一种算法来防止这种重叠 实际知道实际天数

    我已经根据您的要求编写了一些代码。在我看来,使用 Calendar 或 Date 类 afterbefore 方法来比较输入日期,而不是使用数组进行比较。

    创建一个类 AppointmentDetails 来存储约会的详细信息。 您可以在其中添加额外的属性,例如人名等。

    public class AppointmentDetails {
    
        private Calendar startDate;
        private Calendar endDate;
       //getters & setters
         public String toString()
          {
           return "startDate "+ this.getStartDate() + "endDate " + this.getEndDate();
          }
    

    在客户端类中,将约会详细信息存储在 Hashmap 中

    public class AppointmentClient {
    
    
        public static void main(String[] arg)
        {
            System.out.println("Get the appointment");
            //Sample data input for the first appointment
            Calendar startDate = new GregorianCalendar(2015, 1, 6);
            Calendar endDate = new GregorianCalendar(2015, 1, 9);
    
            AppointmentDetails details = new AppointmentDetails();
            details.setStartDate(startDate);
            details.setEndDate(endDate);
    
            //Details added to the hashmap with key as appointment & value as the class holding appointment details
            Map<String,AppointmentDetails> map = new    HashMap<String,AppointmentDetails>();
            map.put("Appointment 1", details);
    
            //Dates for new appointment
            Calendar startDate2 = new GregorianCalendar(2015, 1, 7);
            Calendar endDate2 = new GregorianCalendar(2015, 1, 9);
    
                //logic for validating if the appointment on the input date is already booked
                for(Map.Entry<String, AppointmentDetails> appDtl:map.entrySet())
                {
                    System.out.println("Inside loop");
                    //Every time the loop iterates it will return the respective appointment
                    AppointmentDetails apptDetail = appDtl.getValue();
                    System.out.println(apptDetail);
                    if(((apptDetail.getStartDate().equals(startDate2))||(apptDetail.getEndDate().equals(endDate2)))|| 
                            (apptDetail.getStartDate().after(startDate2))&&(apptDetail.getEndDate().before(endDate2)))
                    {
                         System.out.println("Your appointment is overlapping with the existing appointments");
                         break;
                    }
                }
             }
          }
    

    P.S 这只是一个基本代码,您可以进一步自定义它以提高效率和进一步的逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多