Установка десятичного формата для формата ##. ## в Java - PullRequest
1 голос
/ 24 ноября 2010

Я пытаюсь построить карту со временем, начиная с 06.00 до 23:59, в качестве ключей, и я буду отслеживать число каждый раз в качестве значения. Мне нужно время, чтобы сохранить HH.mm в качестве формата, и я планирую построить карту, используя цикл с шагом в одну минуту, и запустить следующий код внутри цикла. Проблема в том, что, поскольку мне нужно строго установить формат как HH.MM, я должен получить входные данные в виде строки и отформатировать их, а затем проанализировать он обратно удваивается, что влияет на производительность. Есть глобальная настройка, чтобы изменить так, чтобы любой двойной номер, который я выбрал в этом конкретном классе, имел формат ##. ##. Также отметим здесь, что это время, когда оно заканчивается на 60 минут и, следовательно, я должен прервать текущую итерацию с помощью .6.

    Map map = new LinkedHashMap();
    //Edit:Moved DecimalFormat Outside the loop
    DecimalFormat df = new DecimalFormat("##.##");
    for (double time= 06.00; time<= 22.00; time= time+ 01.00)
    {

        String timeString = df.format(appointmentTime);
        time = Double.parseDouble(timeString);

        if (timeString.indexOf(".6") != -1)
        {
            time= time+ 00.40;

        }
        map.put(time,"<number>");
    }

Ответы [ 4 ]

2 голосов
/ 24 ноября 2010

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

for(int totalMinutes = 6 * 60; totalMinutes <= 22 * 60; totalMinutes ++) {
    map.put(buildTimeDouble(totalMinutes),”<number>”);
}

Но я верю (я не понимаю ваш вопросв этом пункте) было бы лучше не использовать double для ключа карты, вместо этого вы могли бы использовать свой собственный класс Time, что-то вроде:

Time{
  private  int hour;
  private int minutes;

  public Time(int hour; int minutes) {
     this.hour = hour;
      this.minutes = minutes;
   }

   public toString(){
      return hour + “:” + minutes
   }

   public static Time fromTotalMinutes(int totalMinutesSinceZeroOclock){
      return new Time(totalMinutesSinceZeroOclock / 60; totalMinutesSinceZeroOclock / 60);
   }
}
0 голосов
/ 24 ноября 2010

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

Вместо этого используйте целочисленный счетчик, из которого вы рассчитываете необходимое время.

0 голосов
/ 24 ноября 2010

Если вы беспокоитесь о производительности, одна из модификаций, которую вы должны внести в свой код, - это создать DecimalFormat только один раз, вне цикла. Один и тот же экземпляр можно использовать снова и снова внутри цикла.

0 голосов
/ 24 ноября 2010

Это не очень хороший подход к предварительным вычислениям для всех этих значений. Возможно, вы можете использовать LRU-кеш . Это может быть легко реализовано с помощью LinkedHashMap . Я также думаю, что вы не следует использовать двойное число для представления времени. Прочтите эту статью , она может дать вам новые идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...