2017-01-10 19 views
0

ネストされたクラス、ネストされたリスト、およびマッピングを読み込んだ後も、これらの3つのメソッドをどのように実装するのか、まだ使用する方法を決めるのはまだ難しいです。ネストされたクラス、ネストされたリスト、またはマップ?

目的:ログファイルからの複数のサービスアップタイムの統計情報をトラッキングします。各サービスの状態の変更は、1行にあり、名前、oldStatus、newStatus、timeChangedを含んでいます。

最後に、これらの行間の時間を確認したいと思いますが、今は単純にデータを正しく

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; 
    } 
} 

すべてが見つけると良いです:

現在、私はそれの建物はここにされたクラスを使用しての道を下って行くとしています。パーザは新しいサービスを検出すると、それをリストに追加して重複がないようにします。その後、サービスステータスが変更されたことを見つけるたびに追加に移りました。私は、各サービスについて、そのデータをどのように格納するかを理解することはできません。

私は、サービス名である一意の識別子と、状態が変わるたびにレコードを保持し、変更されたものと時刻を持つデータベースを使用することに似ていると思います。私はそれを取得した後、私は時間の比較を開始することができます。

ここに変数を含む別のリストを追加するのではなく、それを各サービスにどのように関連付けるのでしょうか?

私は配列を考慮しましたが、Javaでは、データを追加するためにサイズを変更する必要がなく、静的に見えます。私は以来、PHPで、このための回避策を忘れてしまったが、私の限ら過去の経験から、私が構築し、のような配列を使用することができることを思い出し:拡張クラスを使用してのパスを私を導く

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 

を。私はサービスとサービスも受けることができました。サービスは単にサービスのリストを持つことになりますが、サービスは親のサービスクラスにリストされている特定のサービスに基礎となる変数を再びどのように関連づけますか?

もう一度、似ているがあまりにも多くの例を読んだあと、私が達成しようとしているものではないと思っているように思います。または、私は完全に壁から完全に離れており、はるかに良い方法があるかもしれません。

+0

'myServices.get(" TheService ")。newStatus'はもっと" Java Way "になります。とにかく、JavaはPHPではありません。 – user2864740

+0

* "それはリストに追加されるので重複はありません" *この場合、 'HashSet'を使う方が良いでしょう。 – user2004685

+0

サイドノート:命名規則について読む。変数名は、たとえばAllServicesではなくcamelCaseになります。 – GhostCat

答えて

0

DBを使用してログに記録されたイベントを永続化することをお勧めします。これは、多くのイベントを伴う多くのサービスの場合には、より好ましいソリューションです。

そうでなければ、私はメモリに格納するためのいくつかの手順提供:すべての

まず、あなたはサービスの名前でデータを分割する必要があります。それにはMap<K,V>を使用してください。

第二に、私はあなたがServiceEventクラスにoldStatusnewStatustimeChangedを組み合わせることをお勧め:

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

イベントの順不同のシーケンスの場合にはComparatortimeChangedてイベントを注文するとても便利です:

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

したがって、ServiceEventRepositoryは次のようになります。

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); 
    } 
} 

イベントシーケンスに自然順序がある場合は、単純なList<ServiceEvent>を使用してください。 ServiceEventRepositoryは、上記安全スレッドがない

注意。

+0

これは優れています。どうもありがとうございました。私はまだそれを持って遊んでいる - 私はアマチュアだと言わねばならなかったので、私は少し掘り下げに行った。 – mrUlrik

+0

あなたは大歓迎です!それについて具体的な質問をしてください。 –

+0

最終的には、私はデータベースが必要でした(私はあなたのすべてを受け入れています)。しかし、私は@ Gregory.Kの時間を無駄にしたくなかったので、これを実装しました。それはまさに私が元々探していたものです。しかし、私がこの道を下ったとき、私はわずか3つのファイルで作業していました。今は100以上のファイルと20,000以上の行です。私はそれが来るのを見なかったので、私はSQLite以上に移動します。教育と時間をありがとう!これは、オブジェクトの属性を保存する必要がある人にとってはまだ優れています。人< - (身長、体重、年齢) – mrUlrik

関連する問題