поиск всех возможных временных комбинаций между заданным интервалом времени - PullRequest
0 голосов
/ 22 сентября 2018

Мне нужно найти уникальные цифры, присутствующие во всех возможных сочетаниях времени (чч: мм: сс) между 2 определенными моментами времени, например, с 12:09:47 до 14:20:55.В настоящее время я делаю следующее:

  1. Получение значения секунд из времени начала
  2. Добавление 1 к значению этой секунды, а затем генерация нового LocalTime с использованием нового значениясекунд.
  3. Сравнение этого нового времени, чтобы убедиться, что оно меньше времени окончания.
  4. получение цифр из чч: мм: сс и добавление их в коллекцию Set, чтобы только уникальные числа были представлены(Set<Integer> uniqueDigits = new TreeSet<Integer>();)

Но затем, после добавления 59 секунд, как я могу увеличить минуты и часы, чтобы перейти к концу временного диапазона?

У меня есть следующий кодпока:

public int timeCombinations (String startTime, String endTime) {


        LocalTime end = LocalTime.parse(endTime);
        int count = 0;
        for (LocalTime t = LocalTime.parse(startTime, DateTimeFormatter.ofPattern("HH:mm:ss")); t.isBefore(end); t=t.plusSeconds(1)) {
//          System.out.println(t);
//          String timeStr = t.toString();
//          int second = t.get(ChronoField.SECOND_OF_MINUTE);
            System.out.println(t);
            Set<Integer> uniqueDigits = new TreeSet<Integer>();
            String hour = String.valueOf(t.getHour());
            String mins = String.valueOf(t.getMinute());
            String secs = String.valueOf(t.getSecond());

            uniqueDigits.add(Integer.valueOf(String.valueOf(t.getHour()).substring(0,1)));
            if(hour.length()==2) {
                uniqueDigits.add(Integer.valueOf(String.valueOf(t.getHour()).substring(1)));
            }

            uniqueDigits.add(Integer.valueOf(String.valueOf(t.getMinute()).substring(0,1)));
            if(hour.length()==2) {
                uniqueDigits.add(Integer.valueOf(String.valueOf(t.getMinute()).substring(1)));
            }

            uniqueDigits.add(Integer.valueOf(String.valueOf(t.getSecond()).substring(0,1)));            
            if(secs.length()==2) {
                uniqueDigits.add(Integer.valueOf(String.valueOf(t.getSecond()).substring(0,1)));
            }

Я уверен, что есть лучший способ достичь того же результата.Кто-нибудь может предложить альтернативный способ, пожалуйста?

Спасибо

Ответы [ 3 ]

0 голосов
/ 22 сентября 2018

Вы можете сделать с LocalTime.

LocalTime startLocalTime = LocalTime.parse(startTime);
LocalTime endLocalTime = LocalTime.parse(endTime);

while(startLocalTime.isBefore(endLocalTime)){
    startLocalTime = startLocalTime.plusSeconds(1);
    System.out.println(startLocalTime);
}

Будет напечатано все возможное между двумя датами.Для получения дополнительной информации Чтение времени Api

Просто возможность получить счет возможного времени между двумя с продолжительностью.;

//duration calculates start and end date intervals.
Duration between = Duration.between(startLocalTime, endLocalTime);
//you can count how many seconds  or minutes or hours. 
//in your problem , getSeconds - 2 is your result between two time's possible
System.out.println(between.getSeconds());

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

Для получения дополнительной информации прочитайте Продолжительность, Использование периода

0 голосов
/ 22 сентября 2018

Давайте начнем с рассмотрения подхода, который вы выбираете, подхода String .Это определенно выполнимо.Код для этого ниже.

public static void main(String [] args) {
    String time1 = "12:09:47";
    String time2 = "14:20:55";
    List<String> times = getAllTimeValues(time1, time2);
}

public static ArrayList<String> getAllTimeValues(String time1, String time2) {
    ArrayList<String> times = new ArrayList<String>();
    times.add(time1);

    while (!time1.equals(time2)) 
        times.add(time1 = addOneSecond(time1));

    return times;
}

public static String addOneSecond(String time) {
    String[] HoursMinutesSeconds = time.split(":");
    int hours = Integer.parseInt(HoursMinutesSeconds[0]);
    int minutes = Integer.parseInt(HoursMinutesSeconds[1]);
    int seconds = Integer.parseInt(HoursMinutesSeconds[2]);
    if (seconds == 59) {
        if (minutes == 59) {
            hours++;
            minutes = 0;
            seconds = 0;
        } else {
            minutes++;
            seconds = 0;
        }
    } else {
        seconds++;
    }
    return String.format("%02d", hours) + ":" + 
        String.format("%02d", minutes) + ":" + 
        String.format("%02d", seconds);

}

Не так уж и плохо, этот подход выполняет работу за довольно короткий объем кода.Большая часть работы выполняется с помощью метода addOneSecond, который проверяет, равны ли секунды 60, а затем минуты 60.

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

public static void main(String [] args) {
    LocalTime time1 = LocalTime.of(12, 9, 47);
    LocalTime time2 = LocalTime.of(14, 20, 55);
    List<String> times = new ArrayList<String>();

    while (time1.isBefore(time2)) {
        times.add(time1.format(DateTimeFormatter.ISO_LOCAL_TIME).toString());
        time1 = time1.plusSeconds(1);
    }
}

Это значительно меньше кода, чем в первом примере!Опять же, в Java 8 вы можете работать с этими статическими членами классов Date и Time.Намного проще все время проверять.

0 голосов
/ 22 сентября 2018

Может быть, я что-то упускаю, но почему бы не сделать:

static void timeCombinations(String startTime, String endTime) 
{
  DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
  LocalTime end = LocalTime.parse(endTime);
  for(LocalTime t=LocalTime.parse(startTime); t.isBefore(end); t=t.plusSeconds(1))
  {
    System.out.println(dtf.format(t));
  }
  System.out.println(end);
}

Тест:

public static void main(String[] args)
{
  timeCombinations("12:09:59", "12:10:01");
}

Вывод:

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