Check类中的union,excl,diff,intersect

定义一些类,这些类之间有父子关系,如下:

class Father{}
class Son1 extends Father{}
class Son2 extends Father{}

class Top{}
class Middle extends Top{}
class Bottom extends Middle{}

1、incl()方法

源代码如下:

/** Add type set to given type list, unless
 *  it is a subclass of some class  in the list.
 */
public List<Type> incl(Type t, List<Type> ts) {
    List<Type> result;
    // 如果t是ts列表中一些类的子类,则返回这个ts
    if(subset(t,ts)){
        result = ts;
    }else{
        // 如果ts列表中有些类是t的子类,则从ts列表中移除这些子类,
        // 然后追加t后将这个ts列表返回
        List<Type> temp = excl(t, ts);
        result = temp.prepend(t);
    }
    return result;
}

  

2、excl()方法  

源代码如下:

/** Remove type set from type set list.
 */
// 如果ts列表中有些类是t的子类,则从ts列表中移除这些子类后返回,
// 如果ts列表为空,表示没有可移除的或者说已经全部被移除完了,
// 直接返回ts空列表
public List<Type> excl(Type t, List<Type> ts) {
    if (ts.isEmpty()) {
        return ts;
    } else {
        // 需要清楚知道List<Type>这个类型的实现机制
        List<Type> ts1 = excl(t, ts.tail); // 递归
        // 当ts.head是t的子类时,移除这个ts.head,返回ts.tail
        // 处理后的结果
        if (types.isSubtypeCapture(ts.head, t)) {
            return ts1;
        }
        // 当ts.head没有成为t的子类时,则列表中不需要移除
        // 这个ts.head,直接返回ts
        else if (ts1 == ts.tail) {
            return ts;
        }
        // 当ts.head没有成为t的子类时且ts.tail处理结果也有变动,
        // 则追加ts.head到ts1后返回
        else {
            return ts1.prepend(ts.head);
        }
    }
}

  

3、并集union()方法

源代码如下:

/** Form the union of two type set lists.
 */
public List<Type> union(List<Type> ts1, List<Type> ts2) {
    List<Type> ts = ts1;
    for (List<Type> l = ts2; l.nonEmpty(); l = l.tail) {
        ts = incl(l.head, ts);
    }
    return ts;
}

  

4、差集diff()方法

源代码如下:

/** Form the difference of two type lists.
 */
// 如果ts1列表有些类是ts2列表中某些类的子类,则从ts1
// 列表中移除这些子类,最后返回ts1中剩余的类
public List<Type> diff(List<Type> ts1, List<Type> ts2) {
    List<Type> ts = ts1;
    for (List<Type> l = ts2; l.nonEmpty(); l = l.tail) {
        ts = excl(l.head, ts);
    }
    return ts;
}

  

5、交集intersect()方法

源代码如下:

/** Form the intersection of two type lists.
 */
// 如果有ts1列表中含有Father类型,而ts2中含有Father的
// 子类Sub1,Sub2 时,最终返回Sub1,Sub2,表示这个
// Father类型能够catch那两个子类型
public List<Type> intersect(List<Type> ts1, List<Type> ts2) { // todo
    List<Type> ts = List.nil();
    for (List<Type> l = ts1; l.nonEmpty(); l = l.tail) {
        if (subset(l.head, ts2)) {
            ts = incl(l.head, ts);
        }
    }
    for (List<Type> l = ts2; l.nonEmpty(); l = l.tail) {
        if (subset(l.head, ts1)) {
            ts = incl(l.head, ts);
        }
    }
    return ts;
}

  

原文地址:https://www.cnblogs.com/extjs4/p/9452798.html

时间: 2024-10-15 05:10:57

Check类中的union,excl,diff,intersect的相关文章

sql中的union,except及intersect

1.union: 使用union:组合两个结果表,消除重复的记录. 使用union all:组合两个结果表(重复不去重). 2.except: 使用except:在table1中但不在table2中的行,同时消除重复行. 使用except all:不消除重复行. 3.intersect: 获取两个结果集的并集. 版权声明:本文为博主原创文章,未经博主允许不得转载.

【ThinkingInC++】37、更安全的union可以封装在一个类中

/** * 书本:[ThinkingInC++] * 功能:更安全的union可以封装在一个类中 * 时间:2014年9月6日14:53:04 * 作者:cutter_point */ #include<iostream> using namespace std; class SuperVar { //enum没有类型名(他是一个没有加标记的枚举),如果想立即定义enum的实例时, //这种做法是可取的 enum {character, integer, floating_point}vart

Oracle中的Union、Union All、Intersect、Minus[转]

众所周知的几个结果集集合操作命令,今天详细地测试了一下,发现一些问题,记录备考. 假设我们有一个表Student,包括以下字段与数据: drop table student; create table student ( id int primary key, name nvarchar2(50) not null, score number not null ); insert into student values(1,'Aaron',78); insert into student val

Log4Qt使用(三)在DailyRollingFileAppender类中增加属性mMaxBackupIndex

在Log4Qt中存在一个比较大的问题,当使用 DailyRollingFileAppender对日志进行输出时,会无限输出文件,也就是说,当系统运行很久时,日志文件有可能很大,大到无法想象.因此,很多开发者希望在DailyRollingFileAppender中加一个属性,用于配置日志文件的个数. 但是如何做呢? 在Java语言中,我找到一个实例,但是在QT中,没能找到,因此,只能通过自己看源代码,分析从而进行改进. 主要代码如下: dailyrollingfileappender.h: cla

利用反射将IDataReader读取到实体类中效率低下的解决办法

原文:利用反射将IDataReader读取到实体类中效率低下的解决办法 最开始使用反射一个类型的各个属性,对气进行赋值的代码如下: public static List<T> ToList<T>(IDataReader reader) { //实例化一个List<>泛型集合 List<T> DataList = new List<T>(); PropertyInfo[] properties = typeof(T).GetProperties()

在仅拿到头文件的情况下,如何修改类中的私有成员值?

1 通过使用从对象开始处的硬编码/手工编码的偏移量构造指针来访问私有成员数据 class Weak { public: Weak() = default; ~Weak() = default; // 想想如果去掉该函数,外部想修改类中的私有成员变量 m_name 时该如何操作? void name(const std::string &name) { m_name = name; } std::string name() const { return m_name; } private: std

静态修饰符static,类中的常量定义修饰符

static可以用来区分成员变量.方法是属于类本身还是属于类实例化后的对象.有static修饰的成员属于类本身,没有static修饰的成员属于类的实例. 静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失static是一个修饰符,用于修饰成员(成员变量和成员函数)静态成员随着类的加载而加载.静态成员优先于对象存在.静态成员被所有对象所共享静态成员多了一个中调用方式,可以被类名直接调用.静态的优缺点优点: 静态成员多了一种调用方式.可以直接被类名调用 格式 :类名.静态成员.也

检测某个方法是否属于某个类中--解析php函数method_exists()与is_callable()的区别

php函数method_exists() 与is_callable()的区别在哪?在php面相对象设计过程中,往往我们需要在调用某一个方法是否属于某一个类的时候做出判断,常用的方法有 method_exists()和is_callable() 相比之下,is_callable()函数要高级一些,它接受字符串变量形式的方法名作为 第一个参数,如果类方法存在并且可以调用,则返回true.如果要检测类中的方法是否能被调用,可以给函数传递一个数组而不是类的方法名作为参数.数组必须包含对象或类名,以将其作

servlet类中ServletConfig及ServletContext

在一个继承了servlet接口的类中: ServletConfig: 代表:代表了以了一个servlet标签 <servlet> <servlet-name>AServlet</servlet-name> <servlet-class>com.neuedu.path.AServlet</servlet-class> </servlet> 获取:在init方法的参数中. 作用: 获取servlet的名字(web.xml 中的对应的ser