2010-10-25 17 views
1

J'ai un groupe d'événements qui s'est produit à certaines dates. Chaque événement a un champ Date. Maintenant, je voudrais créer une carte où, pour chaque date (prise à partir de toutes les dates d'événements), j'attribuerai la liste des événements survenus à cette date. Donc, en pseudocode:Enregistrement d'un groupe d'objets avec des dates dans une carte

public Map<Date, List<Event>> function(List<Event> list){ 

    Date[]dates = new Date(list.len()); 

    for(Object o: list) 
     add o.date to dates 

    for(int i=0; i<dates.length; i++){ 
     create list of events with date=dates[i] (using some getDate()) 
     add to map(dates[i], list) 
    } 

} 

Est-ce une façon de penser appropriée? Si oui: comment puis-je créer une liste d'événements avec une date spécifique et ensuite l'ajouter à la carte? Je commence juste avec les collections.

EDIT

Je suis en train d'utiliser la solution de hisdrewness. Le dernier problème est comment récupérer des événements avec la date souhaitée. Donc je crée un Iterator sur ma carte mais après? En python c'est facile mais comment puis-je obtenir des objets avec date = date 'en Java?

private String getItems(Date date){ 
    String ret = ""; 
    // DatesSortedMap is my previously built map and it works properly 
    Iterator i = this.DatesSortedMap.entrySet().iterator(); 

    while(i.hasNext()){ 
     //how I can get to the object while having iterator ? 
     if(object.date = date) 
      ret += object; 
    } 

    return ret; 
} 

Répondre

0

Vous êtes la plupart du temps là-bas. Au lieu d'itérer à travers les dates, vous pouvez parcourir les événements, en ajoutant chaque événement au bon "seau" au fur et à mesure.

1

Voilà comment je coder cette méthode:

public Map<Date, List<Event>> function(List<Event> list){ 
    Map<Date, List<Event>> sortedEvents = new HashMap<Date, List<Event>>(); 
    for(Event event : list) { 
     Date eventDate = event.getDate(); 
     if(!sortedEvent.containsKey(eventDate)) { 
      sortedEvent.put(eventDate, new ArrayList<Event>()); 
     } 
     sortedEvent.get(eventDate).add(event); 
    } 
} 

ou pseudo-code:

Loop through events 
    Get event date 
    If Map does not contain member for event date 
     Create new member for event date 
    End if 
    Add event for given event date 
End Loop 

Une mise en garde importante est la comparaison des dates que les clés de hachage. Des choses comme le fuseau horaire, la précision de la milliseconde, etc. devraient être considérées.

EDIT

Pour itérer la valeur de retour:

Map<Date, List<Event>> map = // call sort function 
for(Map.Entry<Date, List<Event>> entry : map.entrySet()) { 
    Date date = entry.getKey(); 
    List<Event> events = entry.getValue(); 
}