给出结果,我需要与表格进行匹配,考虑优先级,假设如下表:
+---+---+
| A | B |
+---+---+
| 1| 1|
+---+---+
| 1| 0|
+---+---+
| 0| 1|
+---+---+
给两行结果集合:
[[A => 1, B => 1], [A => 0, B => 1]]
或
[[A => 0, B => 1], [A => 1, B => 1]]
匹配的结果是[A => 1, B => 1]
,因为它是与表的第一项匹配的结果。
我找到的唯一方法是:
getMatchingResult (result) {
first = null;
second = null;
third = null;
//fill each case if exists
foreach (result as r) {
if (r.A && r.B) {
first = r;
}
if (r.A && !r.B) {
second = r;
}
if (!r.A && r.B) {
third = r;
}
}
//handle priority
if (first)
return first;
else if (second)
return second
else if (third)
return third;
return false;
}
getMatchingResult([[A => 0, B => 1], [A => 1, B => 1]]);
// [A => 1, B => 1]
getMatchingResult([[A => 1, B => 1], [A => 0, B => 1]]);
// [A => 1, B => 1]
有没有更好的方法呢?或者是否有一些算法可以解决这些类型的问题?
谢谢!
答案 0 :(得分:0)
如果r.A和r.B的值是布尔值,那么你可以改善逻辑。但是,如果r.A和r.B的域具有更多值并且表可以增长,则对具有最小索引(=最高优先级)的对的顺序搜索需要许多比较。确实有办法改善这一点。
考虑
class Pair { int a; int b; ... }
Map<Pair,Integer> pair2rank;
这里,地图提供了一对返回表中排名的值的查找。该地图最初是从该表格准备的。然后循环变为
int rank = pair2rank.size(); // bigger than any rank 0, 1,...
foreach (Pair p: results) {
int rp = pair2rank.get( p );
if( rp < rank ) rank = rp;
}
// rank contains the smallest table index