Java 如何将双循环处理转换为更好的处理?

Java 如何将双循环处理转换为更好的处理?,java,algorithm,design-patterns,data-structures,Java,Algorithm,Design Patterns,Data Structures,我有以下设计: 我有一系列的类来处理一些对象,比如说事件。 每个类只处理特定类型的事件。 现在,当我有这些需要处理的对象/事件时,我循环所有事件,然后循环所有处理器,直到完成。 我所做的唯一优化是,如果一个事件不适合立即返回类。 我如何改变我的设计来摆脱这个O(N^2)循环?或者也许它不值得改变,像这样就可以了 更新 算法代码示例: for(Event e:events) { for(Processor p:processors) { p.process(e);

我有以下设计:
我有一系列的类来处理一些对象,比如说事件。
每个类只处理特定类型的事件。
现在,当我有这些需要处理的对象/事件时,我循环所有事件,然后循环所有处理器,直到完成。
我所做的唯一优化是,如果一个事件不适合立即返回类。
我如何改变我的设计来摆脱这个
O(N^2)
循环?或者也许它不值得改变,像这样就可以了

更新
算法代码示例:

for(Event e:events) {  
    for(Processor p:processors) {  
        p.process(e); 
    }  
}  

您可以实现观察者模式。每个处理器将观察对象并侦听事件。处理器将根据事件的类型决定是否处理该事件


Java实际上有两个明确用于此模式的接口:和。

您可以实现Observer模式。每个处理器将观察对象并侦听事件。处理器将根据事件的类型决定是否处理该事件



Java实际上有两个明确用于此模式的接口:和。

如果每个事件类型都有一个特定的处理器,那么您可以创建一个映射(EventClass->EventProcessor),然后现在就可以删除一个循环-O(N)

如果每个事件类型都有一个特定的处理器,那么可以创建一个映射(EventClass->EventProcessor),然后现在就可以删除一个循环-O(N)

你有没有办法给我举个例子或者一点伪代码什么的?很难确切地说出你的意思。但是如果你能做些什么来避免时间,特别是如果你最终会有很多东西需要迭代,你至少应该尝试一下think@SamuelReid:更新了OPMan,如果Java有指针,这会容易得多。您可以将指向处理器的指针放在哈希表中,然后当事件发生时,只需获取所需的处理器。假设我对你的情况理解正确。你有没有办法给我举个例子或者一点伪代码什么的?很难确切地说出你的意思。但是如果你能做些什么来避免时间,特别是如果你最终会有很多东西需要迭代,你至少应该尝试一下think@SamuelReid:更新了OPMan,如果Java有指针,这会容易得多。您可以将指向处理器的指针放在哈希表中,然后当事件发生时,只需获取所需的处理器。假设我正确地理解了你的情况。有什么区别吗?在
观察者
模式中,观察循环一个接一个地覆盖所有观察者。这样看来,我会在单独的“队列”中遍历所有处理器上的所有事件,因为每个事件类型需要不同的可观察性。我错了吗?@Jim-理论是观察者只订阅他们感兴趣的特定对象/事件。最终,您将遍历每个注册的观察者,而不是可能感兴趣或不感兴趣的整个处理器池。你也不会循环每一个事件。事件仅在发生某些事情时触发,这意味着完全避免外部循环。只有您向该事件注册的观察者才会收到通知,因此您向特定事件注册处理器,然后在希望这些特定处理器进行处理时调用NotifyObservators(又名event.notifyObservators())。如果您有一个事件列表,您仍然可以循环所有事件,并为每个事件调用NotifyObservators,跳过每个事件循环所有处理器的需要,只命中您在该事件中注册的处理器。@JustinNiessner:在我的情况下,事件不会发生然后通知观察者。我有大量事件准备处理。考虑到这一事实(大量存在),是否可能提供一些示例(甚至伪)代码?区别是什么?在
观察者
模式中,所有观察者上的可观察循环一个接一个。这样看来,我会在单独的“队列”中遍历所有处理器上的所有事件,因为每个事件类型需要不同的可观察性。我错了吗?@Jim-理论是观察者只订阅他们感兴趣的特定对象/事件。最终,您将遍历每个注册的观察者,而不是可能感兴趣或不感兴趣的整个处理器池。你也不会循环每一个事件。事件仅在发生某些事情时触发,这意味着完全避免外部循环。只有您向该事件注册的观察者才会收到通知,因此您向特定事件注册处理器,然后在希望这些特定处理器进行处理时调用NotifyObservators(又名event.notifyObservators())。如果您有一个事件列表,您仍然可以循环所有事件,并为每个事件调用NotifyObservators,跳过每个事件循环所有处理器的需要,只命中您在该事件中注册的处理器。@JustinNiessner:在我的情况下,事件不会发生然后通知观察者。我有大量事件准备处理。考虑到这一事实(存在的大批量),是否可能提供一些示例(甚至伪)代码?每个处理器只处理特定类型的事件,而不是相反的方式。每个处理器只处理特定类型的事件,而不是相反的方式。