2010-05-02 6 views
0

Je me demandais si quelqu'un pouvait regarder par-dessus un cours que j'ai écrit, je reçois des avertissements génériques dans Eclipse et je me demande simplement si cela pourrait être nettoyé du tout. Tous les avertissements que j'ai reçus sont entourés de ** dans mon code ci-dessous.Génériques et question de performance

La classe prend une liste de chaînes sous la forme (hh: mm AM/PM) et les convertit en objets HourMinute afin de trouver la première fois dans la liste qui vient après l'heure actuelle.

Je suis également curieux de savoir s'il existe des moyens plus efficaces de le faire. Cela fonctionne bien, mais l'étudiant en moi veut juste savoir comment je pourrais faire mieux.

public class FindTime { 
    private String[] hourMinuteStringArray; 

    public FindTime(String[] hourMinuteStringArray){ 
     this.hourMinuteStringArray = hourMinuteStringArray; 
    } 

    public int findTime(){ 

     HourMinuteList hourMinuteList = convertHMStringArrayToHMArray(hourMinuteStringArray); 
     Calendar calendar = new GregorianCalendar(); 
     int hour = calendar.get(Calendar.HOUR_OF_DAY); 
     int minute = calendar.get(Calendar.MINUTE); 
     HourMinute now = new HourMinute(hour,minute); 
     int nearestTimeIndex = findNearestTimeIndex(hourMinuteList, now); 
     return nearestTimeIndex; 
    } 

    private int findNearestTimeIndex(HourMinuteList hourMinuteList, HourMinute now){ 
     HourMinute current; 
     int position = 0; 
     Iterator<HourMinute> iterator = **hourMinuteList.iterator()**; 
     while(iterator.hasNext()){ 
      current = (HourMinute) iterator.next(); 
      if(now.compareTo(current) == -1){ 
       return position; 
      } 
      position++; 
     } 
     return position; 
    } 


    private static HourMinuteList convertHMStringArrayToHMArray(String[] times){ 
     FindTime s = new FindTime(new String[1]); 
     HourMinuteList list = s.new HourMinuteList(); 
     String[] splitTime = new String[3]; 
     for(String time : times){ 
      String[] tempFirst = time.split(":"); 
      String[] tempSecond = tempFirst[1].split(" "); 
      splitTime[0] = tempFirst[0]; 
      splitTime[1] = tempSecond[0]; 
      splitTime[2] = tempSecond[1]; 
      int hour = Integer.parseInt(splitTime[0]); 
      int minute = Integer.parseInt(splitTime[1]); 
      HourMinute hm; 
      if(splitTime[2] == "AM"){ 
       hm = s.new HourMinute(hour,minute); 
      } 
      else if((splitTime[2].equals("PM")) && (hour < 12)){ 
       hm = s.new HourMinute(hour + 12,minute); 
      } 
      else{ 
       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; 
     } 

    } 


If you have any questions let me know. 

Thanks, 
Rob 

Répondre

4

je ne voudrais pas utiliser la classe HourMinute, à moins qu'il ait une autre valeur ajoutée. Si vous avez seulement besoin de trouver l'heure de l'événement la plus proche après un moment donné, convertissez vos chaînes en Date (ou en valeurs longues représentant l'heure) et stockez-les dans une collection triée. La conversion peut être effectuée avec SimpleDateFormat.

Si des éléments sont ajoutés dynamiquement, utilisez TreeSet < Date>, avec les méthodes de plafond (t)/supérieur (t).

Si l'ensemble d'éléments n'est pas dynamique, utilisez un tableau Date [], avec Arrays.binarySearch (..).

public class TimedEventsMgr { 
    private TreeSet<Date> pointsInTime = new TreeSet<Date>(); 
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd hh:mm a"); 

    //timeStr: hh:mm AM/PM 
    public void add(String timeStr) throws ParseException{ 
     Date time = sdf.parse("20000101 "+timeStr); 
     pointsInTime.add(time); 
    } 

    public Date closestFutureTime(Date time){ 
     Calendar c = Calendar.getInstance(); 
     c.setTime(time); 
     c.set(Calendar.YEAR, 2000); 
     c.set(Calendar.MONTH, 0); //January 
     c.set(Calendar.DATE, 1); 
     return pointsInTime.higher(c.getTime()); 
    } 
} 
+0

D'accord, il se peut que je devrais envisager de le faire. Les éléments sont déjà triés mais j'aime l'idée d'utiliser Arrays.binarySearch(). Pensez-vous qu'il y aurait une différence d'efficacité considérable? – tgai

+0

@Tarmon: oui, il y a une différence d'efficacité significative. Votre code renvoie l'élément le plus proche en temps linéaire, tandis que l'alternative ci-dessus le fait en temps logarithmique. –

+0

Très cool. J'apprécie l'exemple. Je vais aller de l'avant et jouer avec ça. – tgai

5

Il est parce que vous ne spécifiez un générique pour votre liste et des instances comparables, qui peuvent soutenir génériques: projet de la première approche

est ici un (de travail). Vous pouvez réécrire votre code avec:

class HourMinuteList extends ArrayList<HourMinute> implements RandomAccess{ 

} 
class HourMinute implements Comparable<HourMinute> { 

    public int compareTo(HourMinute aThat) { 
    .... 
    } 
} 

Note: les génériques ne sont pas nécessaires, et non utilisés lors de l'exécution, mais il est préférable de les utiliser car il vous aide à éviter quelques bugs à votre code.

+0

Merci, je pensais que c'était quelque chose de similaire à cela mais je n'étais pas sûr à cent pour cent. – tgai

+0

Hey Splix, j'apprécie vraiment votre aide mais je pense que je vais explorer l'option Eyal présentée qui rend les génériques en partie inutiles. Je suppose que ce que j'essaie de dire, c'est que j'aimerais pouvoir accepter les deux réponses. – tgai