2010-05-02 3 views
0

Мне было интересно, может ли кто-нибудь просмотреть класс, который я написал, я получаю общие предупреждения в Eclipse, и мне просто интересно, можно ли вообще его очистить. Все предупреждения, которые я получил, окружены ** в моем коде ниже.Вопрос по вопросам создания и производительности

Класс принимает список строк в виде (hh: mm AM/PM) и преобразует их в объекты HourMinute, чтобы найти первый раз в списке, который приходит после текущего времени.

Мне также интересно, если есть более эффективные способы сделать это. Это прекрасно работает, но студент во мне просто хочет узнать, как я могу сделать это лучше.

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 

ответ

4

Я бы не использовал класс HourMinute, если у него нет другой добавленной стоимости. Если вам нужно найти самое близкое время события после определенного момента времени, преобразуйте свои строки в Date (или в длинные значения, представляющие время), и сохраните их в некоторой сортированной коллекции. Преобразование может быть выполнено с помощью SimpleDateFormat.

Если элементы добавлены динамически, используйте TreeSet < Дата>, а также методы потолка (t)/выше (t).

Если набор элементов не является динамическим, используйте массив Дата [], а также 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

Хорошо, мне, возможно, стоит подумать об этом. Элементы уже отсортированы, но мне нравится идея использования Arrays.binarySearch(). Как вы думаете, будет ли значительная разница в эффективности? – tgai

+0

@Tarmon: да, есть значительная разница в эффективности. Ваш код возвращает ближайший элемент в линейном времени, а альтернатива выше - в логарифмическом времени. –

+0

Очень круто. Я ценю пример. Я собираюсь пойти и поиграть с этим. – tgai

5

Это потому, что Вы не указали дженерики для Списка и Сопоставимые экземпляров, которые могут поддерживать дженерики. Вы можете переписать код с:

class HourMinuteList extends ArrayList<HourMinute> implements RandomAccess{ 

} 
class HourMinute implements Comparable<HourMinute> { 

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

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

+0

Спасибо, я думал, что это что-то похожее на это, но я не был на сто процентов уверен. – tgai

+0

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