2013-12-09 3 views
2

У меня есть массив:Отсортировать массив дат на основе текущей даты

| ГГГГ-ММ-ДД || ГГГГ-ММ-ДД || YYYY-MM-DD || ... ||. ... || ....

Теперь я запрашиваю у системы текущую дату и на основании этой даты, я хочу, чтобы мой массив сортировался, год не имеет значения, важно, что месяц и день важны. Мне нужна самая близкая дата в индексе 0 и самая далекая дата последней.

Скажем, например, есть три даты 1999-04-04, 1789-03-01, 2012-05-04

если в апреле месяце: отсортированный массив должен быть как

1999-04-04, 2012-05-04, 1789-03-01.

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

+1

реализовать компаратор и использовать сравнения(). вы можете добавить логику, чтобы игнорировать год и просто проверить месяц и дату. – TheLostMind

+0

Хорошо, позвольте мне проверить это. – User3

+0

Вы можете попробовать реализовать компаратор и проверить свою дату в '' public int compare (T o1, T o2) '', используя '' Days.daysBetween (date1, date2) '' – hbsrud

ответ

1

Я хочу, чтобы мой массив сортировался, год не имеет значения месяц и день . Я хочу, чтобы самая близкая дата указана в 0, а самая дальняя дата .

Вам нужно будет сортировать на основе месяц и день первый: При сравнении любых двух Дата ঃ

сортировать список Дата:

  1. Сравните месяц и если они не равны возврат разница (месяц1 - месяц2) в качестве результата сравнения
  2. Если месяц равен доходности разницы дня месяца в результате сравнения

Так compareTo(Date o) функция реализованного Comparable<Date> будет выглядеть так:

@Override 
    public int compareTo(Date o) { 
    Calendar cal1 = Calendar.getInstance(); 
    cal1.setTime(this.date); 
    Calendar cal2 = Calendar.getInstance(); 
    cal2.setTime(o); 

    int month1 = cal1.get(Calendar.MONTH); 
    int month2 = cal2.get(Calendar.MONTH); 

    if(month1 < month2) 
     return -1; 
    else if(month1 == month2) 
     return cal1.get(Calendar.DAY_OF_MONTH) - cal2.get(Calendar.DAY_OF_MONTH); 

    else return 1; 

    } 

После сортировки вы просто могли бы закруглить список, думая, что это круговое. Например предположим, отсортированный список (за исключением года, как это не имеет значения):

JAN 20, FEB 5, SEP 18, OCT 9, OCT 20, NOV 23 

Если наш стержень (Замкнутая дату по сравнению с датой) является OCT 11 выбор немедленного больше (наименьший срок больше, чем стержень) дата это будет OCT 20. Вы можете найти его только с помощью цикла for.Теперь нам просто нужно округлить думая, что это замкнутый круг:

OCT 20, NOV 23 --> JAN 20, FEB 5, SEP 18, OCT 9 

Формально найти индекс i немедленного увеличения даты по сравнению с нашим шарниром, основываясь на месяц и день (попробуйте использовать пример CompareTo), а затем создать новый список, введите элемент, начинающийся с индекса i, до n-1, а затем 0 - i-1, здесь n - это размер списка дат.

+0

Мне нравится логика :) Я тоже пытаюсь это сделать! – User3

+0

Можно ли использовать тело метода compareTo для реализации метода 'compare' интерфейса' Comparator'? (просто назначив текущее время одному из двух параметров 'compare'.) – DummyBeginner

1

Внесите a java.util.Comparator. Компаратор может принимать дату в конструкторе и хранить его в качестве контрольной даты в атрибуте. Метод compare() может затем решить, какая из прошедших дат ближе к контрольной дате (согласно любому определению закрыть вы предпочитаете).

comperator затем может быть передан вместе с массивом в Array.sort(T[] a, Comparator<? super T> c)

+0

Попытка этого сделать .. будет ударяться, если я найти какие-либо проблемы .. – User3

+0

@ user2822178, используя компаратор, по сути, на самом деле не решит проблему. Мы не должны сортировать его на основе ближайшей даты каждый раз. Проверьте мой ответ – Sage

+0

@Sage с использованием компаратора на самом деле на самом деле * будет * решить проблему. Он просто должен быть компаратором, который реализует требования. Check * my * answer !!!! 1 – Oswald

1

Вы определенно хотите реализовать java.util.Comparator и передать его в метод сортировки. Код в нем должен фактически сравнить абсолютную разницу между количеством дней между кандидатом и текущей датой.

1

это на самом деле проще кодировать, чем объяснить:

Arrays.sort(array, new Comparator<Date>() 
{ 
    Calendar now = Calendar.getInstance(); 

    @Override 
    public int compare(Date d1, Date d2) 
    { 
     Calendar c1 = Calendar.getInstance(); 
     c1.setTime(d1); 
     c1.set(Calendar.YEAR, now.get(Calendar.YEAR)); // year is irrilevant for d1 

     Calendar c2 = Calendar.getInstance(); 
     c2.setTime(d2); 
     c2.set(Calendar.YEAR, now.get(Calendar.YEAR)); // year is irrilevant for d2 

     Long distance1 = Long.MAX_VALUE; 
     Long distance2 = Long.MAX_VALUE; 

     for(int i : new Integer[] { -1, 0, 1 }) 
     { 
      c1.set(Calendar.YEAR, now.get(Calendar.YEAR) + i); 
      c2.set(Calendar.YEAR, now.get(Calendar.YEAR) + i); 

      Long temp1 = Math.abs(c1.getTimeInMillis() - now.getTimeInMillis()); 
      Long temp2 = Math.abs(c2.getTimeInMillis() - now.getTimeInMillis()); 

      distance1 = Math.min(distance1, temp1); 
      distance2 = Math.min(distance2, temp2); 
     } 

     return distance1.compareTo(distance2); 
    } 
}); 
+0

Спасибо, я следую логике :) – User3

+1

отредактирован для сравнения раундов –

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