将线性数据与分组数据进行匹配的有效方法

时间:2016-05-26 05:55:55

标签: java algorithm data-structures

实施例

我有两组数据。我们称之为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

这种方法是否是实现此方案的有效方法?如果不是什么算法最适合解决这个问题?

1 个答案:

答案 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