FAQ > 金融建模 > 建模问题 > 数组操作

Q:如何取两个数组的交集、并集和差集?    

  • A:相关支持的介绍
    天软平台上,可通过多种方式取得两个数组的交集、并集和差集。
    通过矩阵集合运算关键字intersect、union2、minus(一维或二维数组均适用)
    注意:集合的交并差集运算是以行为单位的,而不是以单元格为单位。
    另,还有Outersect对称差集运算符,是减去重复行的并集。

    相关函数有:
    FilterIntersectionPart2(用于一维数组):求两个一维数组的差集、交集、并集;
    FilterIntersectionPart(用于二维数组):求两个数组在指定列名上的差集、交集、并集;

    通过矩阵集合运算关键字范例如下:
    一维数组

    t1:=array(3,2,8);
    t2:=array(9,1,8,3);
    return t1 Outersect t2; //对称差集-array(2,9,1)
    return t1 minus t2; //差集-返回array(2);
    return t1 union2 t2; //并集-返回array(3,2,8,9,1);
    return t1 intersect t2; //交集-返回array(3,8);

    {下面以intersect为例展示不同数据类型的一维数组中的用法,注意根据返回结果进行功能的区别
    其它union2、minus、Outersect都适用
    }
    //多表交集用法-二维数组也支持
    t1:=array(3,2,8);
    t2:=array(9,1,8,3);
    t3:=array(1,8);
    return t1 intersect t2 intersect t3;//返回array(8)

    //支持序列中为字符串
    t1:=array('c',2,'a');
    t2:=array('a',1,'b',3);
    return t1 intersect t2;//返回array("a")

    //注意在表元素中值array(1,2)与array(2,1)是不相等的
    t1:=array('c',2,array(1,2));
    t2:=array('a',1,array(2,1),2);
    return t1 intersect t2;//返回array(2)

    t1:=array('c',2,array(2,1));
    t2:=array('a',1,array(2,1),2);
    return t1 intersect t2;//返回array(2,(2,1))


      a := array(1,2,3,4);
      b := array(3,4,5,6);
      r := array();
      r['交集'] := a intersect b;
      r['并集'] := a union2 b;
      r['差集'] := a minus b;
      return r;

    返回结果:

    二维数组
    用法与一维数组一致,以行为最小判断单位,即行完全一致才能判断相同

    t1:=array(('a':1,'b':2),('a':2,'b':17),('a':2,'b':12));
    t2:=array(('a':3,'b':22),('a':1,'b':2),('a':2,'b':12));
    t3:=array(('a':1,'b':2),('a':2,'b':2));
    return t1 intersect t2 intersect t3;//返回array(("a":1,"b":2))


      a := array(('a':1),('a':2),('a':3),('a':4));
      b := array(('a':3),('a':4),('a':5),('a':6));
      return a union2 b;\\并集

    返回结果:


    函数范例如下:
    一维数组
    通过函数FilterIntersectionPart2

      a := array(1,2,3,4);
      b := array(3,4,5,6);
      r := array();
      r['交集'] := FilterIntersectionPart2(a,b,'IN');
      r['并集'] := FilterIntersectionPart2(a,b,'ALL');
      r['差集'] := FilterIntersectionPart2(a,b,'NOT IN');
      return r;

    返回结果:


    二维数组
    通过函数FilterIntersectionPart

      a := array(('a':1),('a':2),('a':3),('a':4));
      b := array(('a':3),('a':4),('a':5),('a':6));
      return FilterIntersectionPart(a,b,'a','ALL');//并集

    返回结果: