问题描述
我有2套如下
jks - {<1 1> <1 2> <1 3> <2 1> <2 2> <2 3> <3 1> <3 2> <3 3>}
benchPerjk - [{1 3} {1 3} {1 3} {1 3} {1 3} {1 3} {1 2 3} {1 2 3} {1 2 3}]
我现在想在BenchPerjk中找到某个jks的下一个数字
代码如下
tuple jk {
int j;
int k;
}
{jk} jks = { <t.j,t.k> | t in PitBlocksType };
{int} BenchPerjk[v in jks] = { t.i | t in PitBlocksType : t.j == v.j && t.k == v.k };
PitBlocksType来自以下数据:
tuple blockType {
string id;
int i;
int j;
int k;
};
{blockType} PitBlocksType = ...; // Read from excel table which contains several rows,a short example below
/*
Example below
Block Id (i) (j) (k)
P1 1 1 1
P2 1 1 2
P3 1 1 3
P7 3 1 1
P8 3 1 2
P9 3 1 3
P10 1 2 1
P11 1 2 2
P12 1 2 3
P16 3 2 1
P17 3 2 2
P18 3 2 3
P19 1 3 1
P20 1 3 2
P21 1 3 3
P22 2 3 1
P23 2 3 2
P24 2 3 3
P25 3 3 1
P26 3 3 2
P27 3 3 3
*/
之所以要这样做,是因为我想使用BenchPerjk查找下一个i。在下面的代码中代替b.i + 1
如果i是连续的并且对于任何j,k集都存在所有i,则b.i + 1会很好地工作。这意味着Benchperjk是否会
benchPerjk-[{1 2 3} {1 2 3} {1 2 3} {1 2 3} {1 2 3} {1 2 3} {1 2 3} {1 2 3} {1 2 3 }]
但这不是我的数据。
{blockType} OntopPit[b1 in PitBlocksType] =
{b | b in PitBlocksType: b1.i == b.i +1 &&
((b1.k == b.k-1 ) ||
(b1.k == b.k+1 ) ||
(b1.k == b.k ) ) &&
((b1.j == b.j-1 ) ||
(b1.j == b.j+1 ) ||
(b1.j == b.j ) ) };
请提出建议。
{blockType} OntopPit[b1 in PitBlocksType] =
{b | b in PitBlocksType: b1.i == next(BenchPerjk[< b.j,b.k>],b.i) &&
((b1.k == b.k-1 ) ||
(b1.k == b.k+1 ) ||
(b1.k == b.k ) ) &&
((b1.j == b.j-1 ) ||
(b1.j == b.j+1 ) ||
(b1.j == b.j ) ) };
但是出现了两行错误 “ b.i”:next()元素不存在。 数组项的无效初始化表达式:OntopPit []
解决方法
您可以使用下一个:
tuple jk {
int j;
int k;
}
{jk} jks = {<1,1>,<1,2>,3>,<2,<3,3>};
{int} BenchPerjk[jks] = [{1,3},{1,2,3}];
// Now suppose you want to get the next after 1 for <j,k> = <2,1>
int res=next(BenchPerjk[<2,1>],1);
execute
{
writeln(res);
}
给予3
后来需要更通用的东西:
tuple jk {
int j;
int k;
}
{jk} jks = {<1,1);
execute
{
writeln(res);
}
// And now as a generic function
{int} benches=union (jk in jks) BenchPerjk[jk];
int nextone[jk in jks][i in benches]=(i in BenchPerjk[jk])?((i!=last(BenchPerjk[jk]))?next(BenchPerjk[jk],i):-2):-1;
int res2=nextone[<2,1>][1];
execute
{
writeln(res2);
}
给予
3 3