实施例
我有两组数据。我们称之为linear_data和grouped_data
linear_data与1 - 1, 1 - 2, 1 - 3, 2 - 3, 2 - 4, 3 - 6
类似。 (注意:用于表示目的的符号类似于订单ID" - "产品ID)
我必须将这些数据与包含规则的groups_data相匹配
{1 - 1,2,3}, {2 - 3,4}
(注意:用于表示目的的符号类似于规则ID" - "产品ID的有序列表)
规则中最多包含4个值。某些产品ID可能没有任何与之相关的规则。例如。此处产品ID 6不包含与之相关的任何规则。
我希望匹配这两个数据集并检索完全匹配的规则集。
我目前的实施就像
new_data = group linear_data by Order ID
iterate over new_data
permuted_data = create permutation of all Product Id in current Order
matched_rules = {}
for each permuted_data
for each group_data
if match
matched_rules.add(group_data.Rule_Id)
end
end
end
这种方法是否是实现此方案的有效方法?如果不是什么算法最适合解决这个问题?
答案 0 :(得分:1)
创建一个将所有产品ID映射到规则的地图(hashmap,treemap)
映射myMap = new HashMap<>();
例如,例如规则{1 - 1,2,3}, {2 - 3,4}
,地图如下所示:
1 -> { 1 }
2 -> { 1 }
3 -> { 1, 2 }
4 -> { 2 }
然后对于linear_data中的每条记录,使用它的productId,从该productId的地图中检索一组规则,并将检索到的规则集添加到matchedRules
new_data = group linear_data by Order ID
iterate over new_data
for each record from linear_data {
rules = get all rules from map by ProductId => just: rules = myMap.get( productId );
matched_rules.addAll( rules )
}
======编辑==============
如果要查找与所有记录匹配的常用规则,请使用Collection#retainAll
method => https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#retainAll(java.util.Collection)
只是:
// create a set of all possible rules
Set<Intereg> allRules = new HashSet<>();
for( Integer ruleId: myRules.keys() ){
allRules.addAll( myRules.get( ruleId ));
}
new_data = group linear_data by Order ID
iterate over new_data
for each record from linear_data {
rules = get all rules from map by ProductId => just: rules = myMap.get( productId );
// matched_rules.addAll( rules )
allRules.retainAll( rules );
}
// At this point "allRules" contains only rules that match all processed records