2016-11-08 3 views
-1

У меня есть эта функция, которую я должен написать, которая возвращает Collection<String>. Он имеет 3 параметра: LocalTime startDate, LocalTime endDate и Collection<String> logLines. Я должен написать тело функции так, чтобы оно успешно находило и удаляло любые строки из журнала, которые не находятся в определенном таймфрейме, определяемом startDate и endDate, а затем возвращает этот журнал.Методы LocalTime возвращают целые числа, которые не имеют смысла

План, чтобы получить часы, минуты и секунды endDate и startDate использованием LocalTime методов getHour(), getMinute() и getSecond() и конвертировать в секундах, чтобы увидеть, сколько секунд прошло в начале срока, и сколько истекшее к концу таймфрейма. Затем я перебираю все строки в logLines. Они находятся в формате: 2012-05-11T02:11:44Z This program did this operation successfully.. Я разделяю каждую строку, чтобы получить первую часть строки и проанализировать ее, используя LocalTime.parse() в формате ISO_DATE_TIME, чтобы получить дату и сохранить ее в LocalTime logDate. Наконец, я использую те же методы LocalTime, перечисленные выше, чтобы получить общее количество секунд, прошедших до этого времени регистрации.

Проблема, которую я имею что когда я использую LocalTime методы это хранящие все те же числа снова и снова независимо от того, что startDate, endDate или logDate есть. Я никогда не использовал Java 8 или любую библиотеку Java до этого, поэтому я не могу придумать, почему и как это делается. Я знаю, что когда переданы startDate и endDate, они также являются строками в том же формате, что и дата журнала, с использованием LocalDate.parse() и ISO_DATE_TIME.

public Collection<String> search(Collection<String> logLines, LocalTime startDate, LocalTime endDate) { 

    // format date extracted from logLines to same format as startDate and endDate 
    DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME; 

    // total seconds elapsed at startDate 
    // total seconds elapsed by endDate 
    int startSeconds = startDate.getHour() * 60 * 60;  
    startSeconds += startDate.getMinute() * 60; 
    startSeconds += startDate.getSecond(); 

    int endSeconds = endDate.getHour() * 60 * 60; 
    endSeconds += endDate.getMinute() * 60; 
    endSeconds += endDate.getSecond(); 

    // iterate through logLines 
    int i = 0; 
    for(String logLine : logLines) {    

     // array of strings to separate logLine into parts 
     String[] line = new String[2]; 
     line   = logLine.split("\t"); 

     // localTime object to store extracted date from logLines 
     LocalTime logDate = LocalTime.parse(line[0], formatter);    

     // get seconds elapsed from logDate 
     int logDateSeconds = logDate.getHour() * 60 * 60; 
     logDateSeconds += logDate.getMinute() * 60; 
     logDateSeconds += logDate.getSecond(); 

     // print amount of seconds to console 
     System.out.print(logDateSeconds); 
     System.out.print(" "); 
     System.out.print(startSeconds); 
     System.out.print(" "); 
     System.out.print(endSeconds); 
     System.out.print("\n"); 

     if (logDateSeconds > endSeconds || logDateSeconds < startSeconds) { 

      logLines.remove(i); 
      i--; 

     } 

     i++; 

    } 

    return logLines; 

} 

Когда я распечатать startSeconds, endSeconds и logDateSeconds к консоли я получаю

12114 12116 12122 
12114 12116 12122 
12114 12116 12122 
12114 12116 12122 
12114 12116 12122 
12114 12116 12122 
12114 12116 12122 
12114 12116 12122 

независимо от того, какие входы.

Просьба указать мне в правильном направлении.

Пример ввода:

logLines содержит

2012-05-11T02:11:44Z This program did this operation successfully. 
2012-05-11T02:12:52Z This program did this operation successfully. 
2012-05-11T02:14:17Z This program did this operation successfully. 
2012-05-11T02:18:02Z This program did this operation successfully. 
2012-05-11T02:20:30Z This program did this operation successfully. 

startDate = 02:11:44 и endDate = 02:19:57

+0

Вы создаете новый массив без причины. Просто выполните 'String [] line = logLine.split (" \ t ");'. – shmosel

+0

так что 'startSeconds' и' endSeconds' не будут меняться, поэтому единственной относительной частью вашего кода является 'LocalTime logDate = LocalTime.parse (строка [0], formatter);' - какой вход? –

+0

Так я и делал это раньше, но не подозревал, что это могло вызвать проблему, которую я изменил. – kohai

ответ

1

ответ на мой первоначальный вопрос был в том, как я использую for(String logLine : logLines) перебрать logLines. Я изменил его на for(Iterator<String> logLine = logLines.iterator(); logLine.hasNext();). Это благодаря shmosel's comment о том, как я использовал logLines.remove(i). Прежде чем прийти к такому выводу, я заметил, что даты в logLines были моментами, и я попытался использовать DateTimeFormatter.ISO_INSTANT, но LocalTime не смог разобрать время, что имеет смысл. Я также попытался создать LocalDateTime, ZonedDateTime и Instant объектов, но все они вернули ошибку Cannot find symbol. Я не знаю, почему это происходит именно потому, что это мой первый запуск с Java 8 и Java в целом. Единственными классами, которые были доступны мне для манипулирования временем, были java.time.LocalTime и java.time.DateTimeFormatter. Basil Bourque states, что Instant находится в том же пакете, что и LocalTime, и ZonedLocalTime, что я думал то же самое, но, очевидно, эти классы были недоступны для меня в этом проекте.Я также пробовал использовать isBefore(), isAfter() и equals(), но они не функционировали так, как я ожидал, и я решил, что это необязательно, если я могу вычислить прошедшие секунды.

Я тогда столкнулся с другим вопросом, где я получал ошибку Exception in thread "main" java.time.format. Это было интересно, потому что я не мог видеть вход или выход тестового примера, и я понятия не имел, что такое Exception. Я предположил, что проблема заключается в том, что logLine.next() не содержит даты или времени. Чтобы исправить это, я пошарил с try и catch блоками, пытаясь использовать DateTimeParseException без успеха. Я получил ту же ошибку Cannot find symbol, что и раньше. Тогда я понял, что должен быть общий класс Exception, и это исправило проблему. Все работает так, как должно.

Вот исправленный код, который намного меньше и легче читать:

public Collection<String> search(Collection<String> logLines, LocalTime startDate, LocalTime endDate) { 

    // DateTimeFormatter same as startDate and endDate 
    DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME; 

    // total seconds elapsed at startDate 
    // total seconds elapsed at endDate 
    int startSeconds = startDate.toSecondOfDay(); 
    int endSeconds = endDate.toSecondOfDay(); 

    // iterate through logLines 
    for(Iterator<String> logLine = logLines.iterator(); logLine.hasNext();) { 

     // split logLine into two strings: logDate, logDescription 
     // store in string array `line` 
     String[] line = logLine.next().split("\t"); 

     // int for storing amount of seconds from logDate 
     int logDateSeconds; 

     // try to parse logDate 
     // catch generic exception to avoid parsing error 
     try { 

      // parse logDate using ISO_DATE_TIME formatter 
      // get amount of seconds to compare to startSeconds and endSeconds 
      logDateSeconds = LocalTime.parse(line[0], formatter).toSecondOfDay(); 

     } catch (Exception e) { 

      // continue to next iteration for any Exception 
      continue; 

     } 


     // compare amount of seconds to see if it is within time frame 
     if (logDateSeconds >= endSeconds || logDateSeconds < startSeconds) { 

      // remove iteration if it is not within time frame 
      logLine.remove(); 
     } 

    } 

    // return edited 
    return logLines; 

} 
Смежные вопросы