Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 嵌套类、嵌套列表或映射?_Java_Arrays_List_Class_Arraylist - Fatal编程技术网

Java 嵌套类、嵌套列表或映射?

Java 嵌套类、嵌套列表或映射?,java,arrays,list,class,arraylist,Java,Arrays,List,Class,Arraylist,在阅读了嵌套类、嵌套列表和映射之后,我仍然无法确定要使用的正确方法,甚至无法确定如何实现这三种方法 目标:从日志文件跟踪多个服务的运行时间统计信息。每个服务状态更改位于一行上,包含名称、oldStatus、newStatus和timeChanged 最后,我希望看到这两行之间的时间,但现在我只是尝试正确地组织数据 目前,我正在使用一个类,下面是它的构建: public class Services { private List<String> AllServices = ne

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

目标:从日志文件跟踪多个服务的运行时间统计信息。每个服务状态更改位于一行上,包含名称、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;
    }
}
这让我走上了使用扩展类的道路。我可以得到服务,也可以得到服务。服务只会产生一个服务列表,但服务如何再次将其底层变量关联到父服务类中列出的特定服务


再一次,我觉得在阅读了太多类似但与我试图实现的目标不同的例子后,我想我已经想得太多了。或者,我完全不熟悉,可能有更好的方法。

我建议使用任何数据库来持久化记录的事件。在多服务多事件的情况下,它是首选的解决方案

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

首先,您应该按照服务名称划分数据。对其使用
Map

其次,我建议您将
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());
    }
}
如果事件顺序具有自然顺序,请使用简单的
列表


请注意,上面的
serviceventrepository
不是线程安全的。

myServices.get(“TheService”)。newStatus
将是一种更“Java方式”。无论如何,Java不是PHP。“它将它添加到列表中,这样就不会有重复。”在这种情况下,最好使用
HashSet
。旁注:阅读命名约定。变量名只适用于一种情况,而不是所有服务的例子@user2864740实际上,它不是PHP。我试图学习Java的方式,并完全同意。我想你最终也用这个暗示回答了我的问题。@GhostCat我会更深入地研究HashSet,谢谢你。哈!谢谢你的旁注。:)非常感谢。这太棒了。非常感谢你。我还在玩弄它——我应该说我是个业余爱好者,所以我还有点事要做。不客气!请随便问一些具体的问题。最终,我需要一个数据库(我接受你所有的“我告诉过你的”)。但我不想浪费@Gregory.K时间,所以我实现了这个。这正是我最初想要的。不过,当我走上这条路时,我只处理了3个文件。现在它有100多个文件和20000多行。我没有预见到这一点,因此,我将转向SQLite或更高版本。谢谢你的教育和时间!对于需要存储对象属性的人来说,这仍然是非常好的。人
public class ServiceEventComparator implements Comparator<ServiceEvent> {
    @Override
    public int compare(ServiceEvent e1, ServiceEvent e2) {
        return e1.getTimeChanged().compareTo(e2.getTimeChanged());
    }
}
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);
    }
}