2010-04-22 5 views
2

J'ai beaucoup d'informations sur le temps au format hh: mm et je me demandais s'il y avait un bon moyen de prendre cette information et de la comparer à l'heure actuelle. Dites que j'ai une liste de fois pour une journée et je veux savoir quelle heure dans ce tableau de chaînes est le premier qui ne soit pas déjà passé en ce jour. Je regardais l'API Calendar et j'ai pensé que je pourrais casser les chaînes en heures et minutes en la divisant en ":" et ensuite créer un objet de calendrier à partir de cela, mais cela semble plutôt inefficace.Utilisation des temps sur la plateforme Android

Vous recherchez simplement une entrée; merci, Rob

<string-array name="example"> 
    <item>6:58</item> 
    <item>7:41</item> 
    <item>8:08</item> 
    <item>8:28</item> 
    <item>8:48</item> 
    <item>9:08</item> 
    <item>9:43</item> 
    <item>10:13</item> 
    <item>10:43</item> 
    <item>11:13</item> 
    <item>11:43</item> 
    <item>12:09</item> 
    <item>12:29</item> 
    <item>12:49</item> 
    <item>1:09</item> 
    <item>1:29</item> 
    <item>1:49</item> 
    <item>2:09</item> 
    <item>2:29</item> 
    <item>2:49</item> 
    <item>3:09</item> 
    <item>3:29</item> 
    <item>3:49</item> 
    <item>4:09</item> 
    <item>4:29</item> 
    <item>4:49</item> 
    <item>5:09</item> 
    <item>5:29</item> 
    <item>5:49</item> 
    <item>6:29</item> 
    <item>7:09</item> 
    <item>7:47</item> 
    <item>8:27</item> 
    <item>9:07</item> 
    <item>9:47</item> 
    <item>10:27</item> 
</string-array> 

Répondre

3

Créez une ArrayList qui implémente RandomAccess pour vos données. Implémentez un comparateur sur votre heure: objet minute. Mettez votre tableau dans cette liste pour le traitement et le trier.

Saisir l'heure et la minute à partir de l'heure actuelle normalement. Exécuter un Collections.binarySearch() pour obtenir l'index de l'élément de liste qui correspond ou est la prochaine ligne et le renvoyer (c'est le comportement par défaut de binarySearch).

import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.Collections; 
import java.util.GregorianCalendar; 
import java.util.RandomAccess; 

public class scratchpad { 
public static void main(String [] args){ 
    String[] hourMinuteStringArray = {"6:58","7:41","8:08","8:28","8:48","9:08","9:43","10:13","10:43","11:13","11:43","12:09","12:29","12:49","13:09","13:29","13:49","14:09","14:29","14:49","15:09","15:29","15:49","16:09","16:29","16:49","17:09","17:29","17:49","18:29","19:09","19:47","20:27","21:07","21:47","22:27"}; 
    HourMinuteList hourMinuteList = convertHMStringArrayToHMArray(hourMinuteStringArray); 
    Collections.sort(hourMinuteList); 
    Calendar calendar = new GregorianCalendar(); 
    int hour = calendar.get(Calendar.HOUR_OF_DAY); 
    int minute = calendar.get(Calendar.MINUTE); 
    scratchpad s = new scratchpad(); 
    HourMinute now = s.new HourMinute(hour,minute); 
    System.out.println("Now is " + hour + ":" + minute); 
    int nearestTimeIndex = Collections.binarySearch(hourMinuteList, now); 
    if(nearestTimeIndex < 0){ 
     nearestTimeIndex = nearestTimeIndex * -1 -1; 
    } 
    System.out.println("Next time is " + ((HourMinute) hourMinuteList.get(nearestTimeIndex)).getHour() + ":" + ((HourMinute) hourMinuteList.get(nearestTimeIndex)).getMinuteString()); 
} 

private static HourMinuteList convertHMStringArrayToHMArray(String[] times){ 
    scratchpad s = new scratchpad(); 
    HourMinuteList list = s.new HourMinuteList(); 
    for(String time : times){ 
     String[] splitTime = time.split(":"); 
     int hour = Integer.parseInt(splitTime[0]); 
     int minute = Integer.parseInt(splitTime[1]); 
     HourMinute hm = s.new HourMinute(hour,minute); 
     list.add(hm); 
    } 
    return list; 
} 
class HourMinuteList extends ArrayList implements RandomAccess{ 

} 
class HourMinute implements Comparable { 
    int hour; 
    int minute; 

    public HourMinute(int hour, int minute) { 
     setHour(hour); 
     setMinute(minute); 
    } 

    int getMinute() { 
     return this.minute; 
    } 
    String getMinuteString(){ 
     if(this.minute < 10){ 
      return "0" + this.minute; 
     }else{ 
      return "" + this.minute; 
     } 
    } 

    int getHour() { 
     return this.hour; 
    } 

    void setHour(int hour) { 
     this.hour = hour; 
    } 

    void setMinute(int minute) { 
     this.minute = minute; 
    } 

    @Override 
    public int compareTo(Object aThat) { 

     if (aThat instanceof HourMinute) { 
      HourMinute that = (HourMinute) aThat; 
      if (this.getHour() == that.getHour()) { 
       if (this.getMinute() > that.getMinute()) { 
        return 1; 
       } else if (this.getMinute() < that.getMinute()) { 
        return -1; 
       } else { 
        return 0; 
       } 
      } else if (this.getHour() > that.getHour()) { 
       return 1; 
      } else if (this.getHour() < that.getHour()) { 
       return -1; 
      } else { 
       return 0; 
      } 
     } 

     return 0; 
    } 

} 

}

+0

Merci pour le code. J'aurais vraiment pu le comprendre mais tu m'as sauvé un peu de temps. J'ai dû faire quelques changements mais ce que vous avez suggéré était sur place. Merci! – tgai

1

ne pourriez-vous faire juste de l'autre côté? Obtenez l'heure actuelle du calendrier en heures et minutes, et convertissez-les en chaînes, puis comparez-les à vos chaînes.

Si vous avez vraiment beaucoup de données, je pense que vous pourriez construire un trie ou quelque chose de similaire, et en utilisant la chaîne complète de l'heure comme clé pour rechercher quelle entrée correspond le mieux à vos critères?

Questions connexes