2015-11-17 3 views
0

Пытается решить загадку проблемы, но не имеет большой удачи.как найти следующую и предыдущую дату с переменной даты

У меня есть список дат и объект Date, которые получают передается через функцию:

function void dateSorting(List<Date> dateList, Date newDate); 

Основываясь на newDate мне нужно, чтобы выяснить, между которыми 2 индексы списка бы это newDate вписываться в.

, т.е.

если дата 1/3/2015 и список содержит:

INDEX, VALUE 
0 , 5/1/2015 
1 , 20/2/2015 
2 , 15/3/2015 
3 , 11/4/2015 

Тогда функция будет распечатать/возврат 1 и 2, а также соответствующие даты 20/2/2015 & 15/3/2015.

Я прочесывал сеть для псевдокодов и примеров, но не повезло. Ближе всего я пришел к ближайшей дате newDate, которая мне не помогает.

Любая помощь приветствуется.

+0

Хорошо, я думаю, что вы должны опубликовать свой код, что вы пробовали. –

+0

А как насчет newDate - ** 1/1/2015 **? Я имею в виду, что должно получиться. –

+0

1/1/2015 не должен печатать предыдущий, но только следующий, у меня нет рабочего кода, мне не удалось приблизиться к этой проблеме. – Aeseir

ответ

1

Здесь у меня есть один для вас.

void dateSorting(List<Date> dateList, Date newDate) { 

    for (int i = 0; i < dateList.size(); i++) { 
     if (newDate.before(dateList.get(i))) { 
      if (i != 0) 
       System.out.println("Previous index:" + (i - 1)); 
      System.out.println("Next index:" + i); 
      break; 
     } else if (i == dateList.size() - 1) { 
      System.out.println("Previous index:" + i); 
     } 
    } 
} 

И я проверил мой код, как это:

public static void main(String[] args) throws ParseException { 

    List<Date> dateList = new ArrayList<Date>(); 

    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 

    dateList.add(sdf.parse("5/1/2015")); 
    dateList.add(sdf.parse("20/2/2015")); 
    dateList.add(sdf.parse("15/3/2015")); 
    dateList.add(sdf.parse("11/4/2015")); 

    System.out.println("Testing with 1/3/2015."); 

    dateSorting(dateList, sdf.parse("1/3/2015")); 

    System.out.println("Testing with 1/1/2015."); 

    dateSorting(dateList, sdf.parse("1/1/2015")); 

    System.out.println("Testing with 12/4/2015."); 

    dateSorting(dateList, sdf.parse("12/4/2015")); 

} 

И я получил следующий результат:

Testing with 1/3/2015. 
Previous index:1 
Next index:2 

Testing with 1/1/2015. 
Next index:0 

Testing with 12/4/2015. 
Previous index:3 

Я считаю, что это будет полезно для вас.

0

Заменить 17/11/2015 с Date.toString() (дата итератора)

public static void main(String []args){ 
    Date date = new Date(); 
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
    try { 
     date = sdf.parse("17/11/2015"); 
     Calendar cal = Calendar.getInstance(); 
     cal.setTime(date); 
     System.out.println(cal.getTime()); 
     cal.add(Calendar.DAY_OF_MONTH, 1); 
     System.out.println(cal.getTime()); 
    } catch (ParseException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Эти ссылки помогут вам
Ref 1 Ref 2

0

попробовать что-то вроде ниже код:

long current = newDate.getTime(); 
    boolean flag = false; 
    for (int i =1; i < dateList.size(); i++){ 
     long a = dateList.get(i-1).getTime(); long b = dateList.get(i).getTime(); 

     if ((a > current && b < current) || (a < current && b > current){ 
      //newDate is in between index i-1 and i, set flag to true and do your stuff. 
     } 

     if(!flag) { //newDate did not fit between any indexes. 
     } 
    } 

Вы шо uld понимает API-интерфейс Calendar и Date. Предпочтительно использовать API-интерфейс Calender, поскольку большинство методов в Дате устарели.

0

Я думаю, что это то, что вы действительно ожидали:

Сначала вы должны обрешетке класс, реализующий Comparator для сортировки списка Дата:

public class DateSort implements Comparator<Date> { 

@Override 
public int compare(Date d1, Date d2) { 
    return (d1.getTime() > d2.getTime() ? 1 : -1); 
} 

} 

Тогда вы можете получить реализовать алгоритм получить максимальную дату закрытия и ближайшую минимальную дату, указанную ниже:

public class CompareDate { 

    public void compare(String oparation, List<Date> dateList, SimpleDateFormat sdf, Comparator<Date> comparator) 
      throws ParseException { 

     Collections.sort(dateList, comparator); 
     //using joda time api 
     DateTime givenDate = new DateTime(sdf.parse("01/03/2015")); 
     Days diff = Days.days(0); 
     OUTER: 
     for (Date date : dateList) { 
      Days newDiff = Days.daysBetween(new DateTime(date), givenDate); 
      switch (oparation) { 
       case "max-closet": 
        if (newDiff.getDays() < diff.getDays()) { 
         diff = newDiff; 
         System.out.println(oparation + " - " + sdf.format(date)); 
         break OUTER; 
        } 
        break; 
       case "min-closet": 
        if (newDiff.getDays() > diff.getDays()) { 
         diff = newDiff; 
         System.out.println(oparation + " - " + sdf.format(date)); 
         break OUTER; 
        } 
        break; 
      } 
     } 
    } 

    public static void main(String[] args) throws ParseException { 
     List<Date> dateList = new ArrayList<>(); 
     SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
     dateList.add(sdf.parse("05/01/2015")); 
     dateList.add(sdf.parse("20/02/2015")); 
     dateList.add(sdf.parse("15/03/2015")); 
     dateList.add(sdf.parse("11/04/2015")); 
     new CompareDate().compare("max-closet", dateList, sdf, new DateSort()); 
     new CompareDate().compare("min-closet", dateList, sdf, new DateSort().reversed()); 
     //I m reversing the date list so I can sort dates to descending order. 
    } 
} 

Здесь я использовал joda time api, чтобы получить разницу между двумя датами.

Смежные вопросы