2016-11-08 3 views
-1

Ich habe diese Funktion, die ich schreiben soll, die eine Collection<String> zurückgibt. Es hat 3 Parameter: LocalTime startDate, LocalTime endDate und Collection<String> logLines. Ich soll den Funktionskörper schreiben, so dass er alle Zeilen aus dem Protokoll, die nicht innerhalb eines bestimmten Zeitraums sind, der durch startDate und endDate definiert wird, erfolgreich findet und entfernt und dann dieses Protokoll zurückgibt.LocalTime-Methoden, die ganze Zahlen zurückgeben, die keinen Sinn ergeben

Der Plan ist, die Stunden, Minuten zu bekommen, und Sekunden von endDate und startDate mit LocalTime Methoden getHour(), getMinute() und getSecond() und in Sekunden zu konvertieren, um zu sehen, wie viele Sekunden zu Beginn des Zeitraums verstrichen ist und wie viele verstrichene bis zum Ende des Zeitrahmens. Ich iteriere dann über alle Strings in logLines. Sie sind im Format: 2012-05-11T02:11:44Z This program did this operation successfully.. Ich teile jede Zeichenfolge, um den ersten Teil der Zeile zu erhalten, und analysiere sie unter Verwendung von LocalTime.parse() im Format ISO_DATE_TIME, um das Datum zu erhalten und es in LocalTime logDate zu speichern. Schließlich verwende ich dieselben LocalTime Methoden, die oben aufgeführt sind, um die gesamten Sekunden zu erhalten, die bis zu dieser Protokollierungszeit vergangen sind.

Das Problem, das ich habe ist, dass wenn ich die LocalTime Methoden es alle die gleichen Zahlen immer und immer wieder, egal, was die Speicherung startDate, endDate oder logDate ist. Ich habe noch nie zuvor Java 8 oder eine Java-Bibliothek verwendet, so dass ich mir nicht vorstellen kann, warum oder wie es das macht. Ich weiß, dass, wenn startDate und endDate übergeben werden sie auch Strings im selben Format wie das Protokolldatum mit LocalDate.parse() und dem ISO_DATE_TIME Format analysiert werden.

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; 

} 

Wenn ich startSeconds ausdrucken, endSeconds und logDateSeconds an die Konsole bekomme ich

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

egal, was die Eingaben.

Bitte zeigen Sie mir in die richtige Richtung.

Probeneingang:

logLines enthält

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 und endDate = 02:19:57

+0

Sie ohne Grund ein neues Array erstellen. Tun Sie einfach 'String [] line = logLine.split ("\ t"); '. – shmosel

+0

Also, 'startSeconds' und' endSeconds' ändern sich nicht, der einzige relevante Teil Ihres Codes ist 'LocalTime logDate = LocalTime.parse (Zeile [0], Formatierer);' - Was ist die Eingabe? –

+0

So habe ich das schon mal gemacht, aber ohne zu wissen, ob das ein Problem verursacht hat, habe ich es geändert. – kohai

Antwort

1

Die Antwort auf meine erste Frage war in der Art, wie ich for(String logLine : logLines) wurde mit loglines iterieren. Ich änderte es zu for(Iterator<String> logLine = logLines.iterator(); logLine.hasNext();). Dies ist dank shmosel's comment auf, wie ich logLines.remove(i) verwendet habe. Bevor ich zu dieser Schlussfolgerung kam, bemerkte ich, dass die Daten in logLines Augenblicke waren und ich versuchte, DateTimeFormatter.ISO_INSTANT zu verwenden, aber LocalTime konnte die Zeit nicht analysieren, was sinnvoll ist. Ich habe auch versucht, LocalDateTime, ZonedDateTime und Instant Objekte zu erstellen, aber sie alle zurückgegeben den Fehler Cannot find symbol. Ich weiß nicht, warum das genau deshalb ist, weil dies mein erster Durchlauf mit Java 8 und Java im Allgemeinen ist. Die einzigen Klassen, die mir zur Verfügung standen, um die Zeit zu manipulieren, waren java.time.LocalTime und java.time.DateTimeFormatter. Basil Bourque states, dass Instant ist in dem gleichen Paket wie LocalTime und ZonedLocalTime, die ich dachte, das gleiche, aber eindeutig waren diese Klassen nicht zugänglich für mich in diesem Projekt.Ich versuchte auch mit isBefore(), isAfter() und equals(), aber sie funktionierten nicht wie ich erwartet hatte und ich dachte, dass es unnötig war, wenn ich die verstrichenen Sekunden berechnen kann.

Ich lief dann in ein anderes Problem, wo ich einen Exception in thread "main" java.time.format Fehler bekam. Das war interessant, weil ich die Eingabe oder die Ausgabe des Testfalls nicht sehen konnte und ich hatte keine Ahnung, was ein Exception war. Ich nahm an, das Problem war, dass logLine.next() kein Datum oder Uhrzeit enthielt. Um dies zu beheben, fummelte ich mit try und catch Blöcke, versuchen, DateTimeParseException ohne Erfolg zu verwenden. Ich habe den gleichen Cannot find symbol Fehler wie zuvor. Dann erkannte ich, dass es eine generische Exception Klasse geben muss und das Problem behoben wurde. Alles funktioniert wie es soll.

Hier ist die korrigierte Code, der viel kleiner und leichter zu lesen ist:

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; 

} 
Verwandte Themen