我想做什么;从包含在map结构中的任何arraylist元素的cep开始,并继续使用我已经开始的其余arraylist元素。Map和图案结构:
final Map< Integer,ArrayList<String>> deger = new HashMap<Integer,ArrayList<String>>();
deger.put(1,new ArrayList<String>(Arrays.asList("h:1","l:1","g:0")));
deger.put(2,new ArrayList<String>(Arrays.asList("h:1","l:1","g:1")));
deger.put(3,new ArrayList<String>(Arrays.asList("h:2","l:3","g:1")));
deger.put(4,new ArrayList<String>(Arrays.asList("h:0","l:2","g:2")));
for(int i=1;i<deger.size()+1;i++) {
temp1.add(deger.get(i));
}
Pattern<String,?> pattern = Pattern.<String>begin("start").where(
new SimpleCondition<String>() {
// @Override
public boolean filter(String value) throws Exception {
for (ArrayList<String> aa: temp1){
for (String dd : aa)
if(value.equals(dd)){
return true;
}
}
return false;
}
}
).followedBy("middle").where(
new SimpleCondition<String>() {
@Override
public boolean filter(String value) throws Exception {
return value.equals(temp1.get(1));
}
}
).followedBy("end").where(
new SimpleCondition<String>() {
@Override
public boolean filter(String value) throws Exception {
return value.equals(temp1.get(2));
}
}
);
我的目的是对Map中的arraylist元素发出警告,但是由于其中的流,arraylist元素的顺序并不重要。我想继续处理此数组的其余元素,在这里开始任何数组时,我可以返回此数组的信息。例如:
Incoming data = "l:1","h:1","g:0"
my pattern = "h:1","l:1","g:0"
Start -> l:1 find
Middle -> g:0 or h:1 | h:1 find
End -> g:0 find -> alarm
2条答案
按热度按时间ep6jt1vc1#
我从你的问题中了解到可以提供这种解决办法。
kqqjbcuj2#
所以目前afaik flink不支持开箱即用的非有序模式,所以基本上我看到了两种解决这个问题的方法:
1) 您可以创建要搜索的所有可能的模式,并简单地合并所有生成的数据流。
2) 正如这篇文章所建议的:我可以引用一个早期的事件来定义一个后续的匹配吗?你可以试着用
IterativeCondition
这将允许您访问之前已经匹配的元素,因此基本上您必须定义匹配列表中所有可能元素的模式,然后只要检查最后一个条件,如果这三个元素都属于同一个列表。如果是这样的话,就找到了模式。