嵌套类,嵌套列表或地图?

时间:2017-01-10 17:16:31

标签: java arrays list class arraylist

在阅读嵌套类,嵌套列表和映射之后,我仍然无法确定使用的正确方法,甚至还有如何实现这三种方法。

目标:从日志文件跟踪多个服务的统计数据。每个服务状态更改都在一行中,并包含Name,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

这使我走上了使用扩展类的道路。我可以有服务和服务。服务只会产生一个服务列表,但是服务如何再次将它的底层变量与父服务类中列出的特定服务相关联?

再一次,在我阅读了太多类似的例子之后,我觉得我已经过度思考了这一点,而不是我想要完成的事情。或者,我完全不在墙上,可能会有更好的方法。

1 个答案:

答案 0 :(得分:0)

我建议使用任何数据库来保存已记录的事件。对于许多具有许多事件的服务,它是优选的解决方案。

否则,我提供了几个步骤将它们存储在内存中:

首先,您应该按服务名称划分数据。使用Map<K,V>即可。

其次,我建议您将oldStatusnewStatustimeChanged合并到ServiceEvent类:

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

在无序序列事件的情况下,timeChangedComparator订购活动很方便:

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不是线程安全的