2017-01-10 3 views
0

Nach dem Lesen verschachtelter Klassen, verschachtelter Listen und Mapping habe ich immer noch Probleme, die richtige Methode zu bestimmen und sogar noch, wie diese drei Methoden implementiert werden können.Verschachtelte Klassen, verschachtelte Listen oder Karten?

Ziel: Verfolgen von Statistiken über mehrere Dienste in einer Protokolldatei. Jede Änderung des Dienststatus ist in einer Zeile und enthält den Namen, den altenStatus, newStatus und timeChanged.

Am Ende möchte ich die Zeit zwischen diesen Zeilen sehen, aber im Moment versuche ich einfach zu organisieren Daten richtig.

Derzeit Ich gehe die Straße hinunter, eine Klasse zu verwenden und hier ist das Gebäude davon:

public class Services { 
    private List<String> AllServices = new ArrayList<String>(); 
    // Initial thought of adding another list here, containing 
    // the variables, but how would I associate that to the 
    // service above? 
    private List<String> ServiceStatus; 



    public boolean AddService(String name) { 
     if (!AllServices.contains(name)) { 
      AllServices.add(name); 
      return true; 
     } 
     return false; 
    } 

    public List<String> GetServices() { 
     return AllServices; 
    } 
} 

Das ist alles finden und gut ist. Wenn der Parser einen neuen Dienst entdeckt, fügt er ihn der Liste hinzu, sodass keine Duplikate vorhanden sind. Dann habe ich jedes Mal hinzugefügt, wenn ein Dienststatus geändert wurde. Ich kann nicht herausfinden, wie für jeden Dienst diese Daten gespeichert werden.

Ich denke, ich könnte es mit der Verwendung einer Datenbank mit dem eindeutigen Bezeichner als Dienstname vergleichen, der Datensätze für jedes Mal enthält, wenn sich der Status ändert, in was er geändert wurde und in die Uhrzeit. Sobald ich das verstanden habe, kann ich anfangen, die Zeiten zwischen zu vergleichen.

Erste Idee, hier eine weitere Liste hinzuzufügen, die die Variablen enthält, aber wie würde ich das jedem Service zuordnen?

Ich dachte Arrays, aber in Java scheinen sie eher statisch, als in der Größe zu ändern, um mehr Daten hinzuzufügen. Ich habe die Arbeit um für diese in PHP, da vergessen, aber aus meiner begrenzten Erfahrungen aus der Vergangenheit Ich erinnere mich, in der Lage, Arrays aufzubauen und zu verwenden wie:

statusChanged = myServices["TheService"][i][date]; 
statusChangedTo = myServices["TheService"][i][new_status]; 
statusChangedTo = myServices["OtherService"][i][date]; 
statusChangedTo = myServices["OtherService"][i][new_status]; 

AllServices 
|- TheService 
| |- TimeDate 
|  | - New Status 
|  | - Old Status 
|- OtherService 
    |- TimeDate 
     | - New Status 
     | - Old Status 

Was mich führen hinunter den Weg der erweiterten Klassen verwenden. Ich könnte Dienstleistungen und auch Service haben. Dienste würden dazu führen, nur eine Liste von Diensten zu haben, aber wie fügt der Dienst seine zugrunde liegenden Variablen wieder bestimmten Diensten hinzu, die in der übergeordneten Dienstklasse aufgelistet sind?

Noch einmal, ich habe das Gefühl, dass ich das überdenke, nachdem ich zu viele Beispiele gelesen habe, die ähnlich sind, aber nicht zu dem, was ich erreichen möchte. Oder ich bin einfach komplett von der Wand und es könnte eine weitaus bessere Methode geben.

+0

'myServices.get (" TheService "). NewStatus wäre ein" Java Way ". Wie auch immer, Java ist kein PHP. – user2864740

+0

* "Es fügt es der Liste hinzu, so dass es keine Duplikate gibt." * In diesem Fall ist es besser, 'HashSet' zu verwenden. – user2004685

+0

Randnotiz: Lesen Sie über Namenskonventionen. Variablennamen gehen CamelCase, nicht AllServices zum Beispiel! – GhostCat

Antwort

0

Ich empfehle, einen DB zu verwenden, um protokollierte Ereignisse zu persistieren. Es ist eine bevorzugte Lösung bei vielen Diensten mit vielen Ereignissen.

Ansonsten stelle ich ein paar Schritte für sie in Speicher:

Zunächst einmal sollten Sie Daten teilen, indem er Name des Dienstes. Verwenden Sie dafür Map<K,V>.

Zweitens schlage ich Ihnen oldStatus, newStatus und timeChanged in ServiceEvent Klasse zu kombinieren:

public class ServiceEvent { 
    private final String oldStatus; 
    private final String newStatus; 
    private final DateTime timeChanged; 
    // methods... 
} 

Es ist convinient mit Comparator bei ungeordneten Abfolge von Ereignissen durch timeChanged Veranstaltungen zu bestellen:

public class ServiceEventComparator implements Comparator<ServiceEvent> { 
    @Override 
    public int compare(ServiceEvent e1, ServiceEvent e2) { 
     return e1.getTimeChanged().compareTo(e2.getTimeChanged()); 
    } 
} 

So kann Ihr ServiceEventRepository wie folgt sein:

public class ServiceEventRepository { 
    private Map<String, SortedSet<ServiceEvent>> storage = new HashMap<>(); 

    public void addEvent(String service, ServiceEvent event) { 
     SortedSet<ServiceEvent> events = storage.get(service); 
     if (events == null) { 
      events = new TreeSet<ServiceEvent>(new ServiceEventComparator()); 
      storage.put(service, events); 
     } 
     events.add(event); 
    } 
} 

Verwenden Sie einfach List<ServiceEvent>, wenn die Reihenfolge der Ereignisse eine natürliche Reihenfolge hat.

Beachten Sie, dass die obige ServiceEventRepository nicht Thread-Safe ist.

+0

Das ist ausgezeichnet. Vielen Dank. Ich spiele immer noch damit herum - ich hätte erwähnen sollen, dass ich ein Amateur bin, also muss ich ein bisschen graben. – mrUlrik

+0

Gern geschehen! Fühlen Sie sich frei, spezifische Fragen dazu zu stellen. –

+0

Letztendlich brauchte ich eine Datenbank (ich akzeptiere alle deine 'Ich sagte dir so'). Aber ich wollte nicht @ Gregory.K Zeit verschwenden, also habe ich dies umgesetzt. Es ist genau das, wonach ich ursprünglich gesucht habe. Obwohl ich diese Straße entlang ging, arbeitete ich nur mit 3 Dateien. Jetzt sind es über 100 Dateien und über 20.000 Zeilen. Ich habe das nicht kommen sehen, also werde ich zu SQLite oder höher wechseln. Danke für die Ausbildung und Zeit! Und das ist immer noch hervorragend für jemanden, der Attribute eines Objekts speichern muss. Person <- (Größe, Gewicht, Alter) – mrUlrik