2010-10-07 4 views
6

J'ai une liste de dates et une date du jour.Trouver le prochain jour sur une liste

Comment puis-je trouver la date la plus proche de la date actuelle?

+1

Pourriez-vous être plus précis? On dirait que vous avez une liste de dates, et vous voulez trouver celui qui est le plus proche de maintenant? Un exemple de code court serait utile –

+0

-1 s'il vous plaît donner plus de détails –

Répondre

2

boucle par toutes les dates avec les éléments suivants:
1. Avoir une variable qui garde la trace de la date la plus proche actuelle
2. Avoir une variable qui est la différence entre la date la plus proche actuelle et la date actuelle

Lorsque vous trouvez une date avec une différence inférieure à celle de ce que vous suivez dans (2), mettez à jour la différence et la date la plus proche

À la fin, la date la plus proche est la date la plus proche dans la collection

Code est ici en python:

dates = [date(2010,1,2), date(2010,5,6), date(2010,3,4), date(2011, 1, 2), date(2010,10,20), date(2009,2,3)] 
current_date = dates[0] 
current_min = abs(current_date - date.today()) 
for d in dates: 
    if abs(d - date.today()) < current_min: 
     current_min = abs(d - date.today()) 
     current_date = d 
+0

s'il vous plaît donnez-moi un exemple –

20

J'utilise Collection.min avec un comparateur personnalisé « commandes » les dates en fonction de la distance de temps en cours.

final long now = System.currentTimeMillis(); 

// Create a sample list of dates 
List<Date> dates = new ArrayList<Date>(); 
Random r = new Random(); 
for (int i = 0; i < 10; i++) 
    dates.add(new Date(now + r.nextInt(10000)-5000)); 

// Get date closest to "now" 
Date closest = Collections.min(dates, new Comparator<Date>() { 
    public int compare(Date d1, Date d2) { 
     long diff1 = Math.abs(d1.getTime() - now); 
     long diff2 = Math.abs(d2.getTime() - now); 
     return Long.compare(diff1, diff2); 
    } 
}); 
+1

Grande réponse ... –

+0

@aioobe: Pourquoi nous ne pouvions pas comparer seulement getTime (pas Math.abs (d1.getTime() - à présent))? –

+2

@Stas: Parce que sinon les dates de commande "naturellement". Nous voulons commander par différence avec 'now'. Solution intelligente cependant. Cela mérite un +1 même si l'OP est un imbécile. – BalusC

2

Vous pouvez essayer ce code:

public static Date closerDate(Date originalDate, Collection<Date> unsortedDates) { 
    List<Date> dateList = new LinkedList<Date>(unsortedDates); 
    Collections.sort(dateList); 
    Iterator<Date> iterator = dateList.iterator(); 
    Date previousDate = null; 
    while (iterator.hasNext()) { 
     Date nextDate = iterator.next(); 
     if (nextDate.before(originalDate)) { 
      previousDate = nextDate; 
      continue; 
     } else if (nextDate.after(originalDate)) { 
      if (previousDate == null || isCloserToNextDate(originalDate, previousDate, nextDate)) { 
       return nextDate; 
      } 
     } else { 
      return nextDate; 
     } 
    } 
    return previousDate; 
} 

private static boolean isCloserToNextDate(Date originalDate, Date previousDate, Date nextDate) { 
    if(previousDate.after(nextDate)) 
     throw new IllegalArgumentException("previousDate > nextDate"); 
    return ((nextDate.getTime() - previousDate.getTime())/2 + previousDate.getTime() <= originalDate.getTime()); 
} 
4

Si la liste est triée, vous pouvez utiliser Collections.binarySearch() pour trouver l'endroit où la date donnée sera triée dans la liste - celle la plus proche est soit juste après ou juste avant cet indice.

Pour les très grandes listes, c'est beaucoup plus rapide que les autres solutions, mais bien sûr, il faut trier la liste. Si vous faites une telle requête plusieurs fois, cela vaudra la peine (en termes de performances) de trier la liste en premier.

1

Si vous pouvez utiliser un Set au lieu d'un List, mettre les dates dans un NavigableSet tels que TreeSet et utiliser les méthodes lower et higher.

NavigableSet<Date> dates = new TreeSet<Date>(); 
// add some dates to dates 
Date now = new Date(); 
Date highestDateUpUntilNow = dates.lower(now); 
Questions connexes