2010-07-30 2 views
-1

Я не знаю, правильно ли я описал это. У меня есть несколько списков дат в Java. Теперь мне нужно знать, когда список содержит не менее 4 дат, следующих друг за другом. например «2010-06-27, 2010-06-28, 2010-06-29, 2010-06-30». Мне просто нужна идея, с чего начать ... Спасибо!Проверьте, соответствуют ли даты из списка <Date>

ответ

0

Это мой подход ...

public List<List> getList(List<List<Date>> lists, int num) { 
    List<List> result = new ArrayList<List>(); 
    for (List list : lists) { 
     Collections.sort(list); 
     if (checkList(list, num)) { 
      result.add(list); 
     } 

    } 
    return result; 
} 

public boolean checkList(List<Date> list, int num) { 
    int count = 0; 
    for (int i = 0; i < list.size() - 1; i++) { 
     Calendar calendar1 = Calendar.getInstance(); 

     calendar1.setTime(list.get(i)); 
     calendar1.set(Calendar.DAY_OF_MONTH,calendar1.get(Calendar.DAY_OF_MONTH)+1); 
     calendar1.set(Calendar.HOUR_OF_DAY,0); 
     calendar1.set(Calendar.MINUTE,0); 
     calendar1.set(Calendar.MILLISECOND,0); 

     Calendar calendar2 = Calendar.getInstance(); 
     calendar2.setTime(list.get(i + 1)); 
     calendar2.set(Calendar.HOUR_OF_DAY,0); 
     calendar2.set(Calendar.MINUTE,0); 
     calendar2.set(Calendar.MILLISECOND,0); 

     if (calendar1.equals(calendar2)) { 
      count++; 
     } else { 
      count = 0; 
     } 
     if (count >= num) { 
      return true; 
     } 
    } 
    return false; 
} 
+0

getDate() - день месяца, не будет работать через границу месяца. Кроме того, он устарел. – unbeli

+0

Yup. Я предлагаю использовать Календарь ... Но я просто прототип метода: P –

+0

Я думаю, что он должен сделать свое собственное кодирование: D –

1

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

+0

Спасибо. Не думал об итераторе и методе compare (to) метода Date. my bad =) Thx в любом случае! – tzippy

+0

Рад помочь, может быть, вы решите принять один из ответов здесь. – thelost

+0

Удерживайте: цифры в глубине 'Date'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Вы можете выполнить 'compareTo()', но не ожидайте увидеть '1' как разницу между двумя последовательными днями! –

0

Преобразовать дату в миллисекундах с помощью дата/календарь классов, а затем Comparation тривиально.

1

Что об этом:

public static boolean checkList(List<Date> list) { 
    int count = 0; 
    for (int i = 0; i < list.size()-1; ++i) { 
     if (list.get(i).after(list.get(i+1))) { 
      count = 0; 
     } else { 
      ++count; 
      if (count == 4) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 
0

Теперь это мой подход. возвращает список целых чисел, представляющих длину каждой серии дней в строке за этот период времени. Спасибо Расселу за ваш метод. Я попробовал compareto() Date, пока не понял, что его возвращаемое значение не представляет дни, когда две сравниваемые даты отделяются друг от друга.

 public List<Integer> countdaysinarow(List<Date> dates){ 
    int daysinarow = 0; 

    List<Integer> list = new ArrayList<Integer>(); 

    for (int i = 0; i < dates.size() - 1; i++) { 
     Calendar cal1 = Calendar.getInstance(); 
     cal1.setTime(dates.get(i)); 
     Calendar cal2 = Calendar.getInstance(); 
     cal2.setTime(dates.get(i + 1)); 
     cal1.set(Calendar.DAY_OF_YEAR, cal1.get(Calendar.DAY_OF_YEAR) + 1); 

     if(cal1.equals(cal2)){ 
      daysinarow++; 
     } 
     else if(daysinarow > 0){ 
       list.add(new Integer(daysinarow)); 
      daysinarow = 0; 
     } 

     if(daysinarow != 0 && (i == dates.size() - 2)){ 
      list.add(new Integer(daysinarow)); 
     } 
    }  
    return list; 
} 
Смежные вопросы