2017-01-10 2 views
0

После прочтения вложенных классов, вложенных списков и сопоставления у меня все еще возникают проблемы с выбором правильного метода для использования и даже при том, как реализовать эти три метода.Вложенные классы, вложенные списки или карты?

Цель: отслеживание статистики нескольких сервисов за раз в журнале. Каждое изменение статуса службы находится в одной строке и содержит имя, старое состояние, новое состояние и 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 

, которые ведут меня по пути использования расширенных классов. Я мог бы иметь Службы, а также Службу. Службы приведут к простому перечню услуг, но как же Service снова связывает его базовые переменные с конкретными службами, перечисленными в классе родительских служб?

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

+0

'myServices.get (« TheService »). NewStatus' будет более« Java-способом ». Во всяком случае, Java не является PHP. – user2864740

+0

* «Он добавляет его в список, поэтому нет дубликатов». * В этом случае будет лучше использовать «HashSet». – user2004685

+0

Сторона примечания: читайте о соглашениях об именах. Переменные имена находят camelCase, а не AllServices, например! – GhostCat

ответ

0

Предлагаю использовать любую БД для сохранения зарегистрированных событий. Это предпочтительное решение в случае многих услуг со многими событиями.

В противном случае, я обеспечиваю несколько шагов для их хранения в памяти:

Прежде всего, вы должны разделить данные по имени службы. Используйте для этого Map<K,V>.

Во-вторых, я предлагаю вам совместить oldStatus, newStatus и timeChanged в ServiceEvent класс:

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

Это удобно заказать события по timeChanged с Comparator в случае неупорядоченного последовательности событий:

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, поэтому я реализовал это. Это именно то, что я изначально искал. Хотя, когда я пошел по этой дороге, я работал только с тремя файлами. Теперь это более 100 файлов и более 20 000 строк. Я не видел этого, поэтому я перейду к SQLite или больше. Спасибо за образование и время! И это все равно отлично для кого-то, кто должен хранить, скажем, атрибуты объекта. Лицо <- (высота, вес, возраст) – mrUlrik

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