10 July 2018

枚举包装接口

public interface FilterEnums {

    Enumeration<FlagStatsCode> elements();
    int length();

}

实现

public class StatCodeEnumerator implements FilterEnums {

    private FlagStatsCode[] codes;


    public StatCodeEnumerator(FlagStatsCode[] codes) {
        assert (codes != null);
        this.codes = codes;

    }

    @Override
    public Enumeration<FlagStatsCode> elements() {
        return new Enumeration<FlagStatsCode>() {
            private int count = 0;

            @Override
            public boolean hasMoreElements() {
                return count < StatCodeEnumerator.this.codes.length;
            }

            @Override
            public FlagStatsCode nextElement() {
                return StatCodeEnumerator.this.codes[count++];
            }
        };
    }

    @Override
    public int length() {
        return codes.length;
    }
}

状态Entries

public class FlagStatsCode {

    private int code;
    private String stats;

    public FlagStatsCode(String stats, int code) {
        this.code = code;
        this.stats = stats;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getStats() {
        return stats;
    }

    public void setStats(String stats) {
        this.stats = stats;
    }
}

聚合计算器

public class FilterAggregator {
    final int F_FLAG = 0xffffffff;
    final int H_FLAG = 0xffff0000;
    final int L_FLAG = 0x0000ffff;

    private int allowedStatus = 0;

    StatCodeEnumerator userFilter = null;

    public FilterAggregator(StatCodeEnumerator userFilter) {
        assert (userFilter != null);
        this.userFilter = userFilter;
        validate();
    }

    public int aggStatus(int mix_signal) {
        if (allowedStatus != (allowedStatus | mix_signal)) {
            throw new RuntimeException("Can't match signal");
        }
        return allowedStatus & mix_signal;
    }

    public List<FlagStatsCode> aggStatusDef(int mix_signal) {
        List<FlagStatsCode> filters = new ArrayList<>();
        if (allowedStatus != (allowedStatus | mix_signal)) {
            throw new RuntimeException("Can't match signal");
        }
        int op = allowedStatus & mix_signal;
        Enumeration<FlagStatsCode> codes = userFilter.elements();
        while (codes.hasMoreElements()) {
            FlagStatsCode def = codes.nextElement();
            int code = def.getCode();
            if ((op & code) == code) {
                filters.add(new FlagStatsCode(def.getStats(), code));
            }
        }
        return filters;
    }

    public void validate() {
        int rec_flags = 0;
        Enumeration<FlagStatsCode> codes = userFilter.elements();
        while (codes.hasMoreElements()) {
            int f = codes.nextElement().getCode();
            if ((f & H_FLAG) == 0 && (f & L_FLAG) != 0 && (f & rec_flags) == 0) {
                int check_point = 1;
                int eql_count = 0;
                for (int i = 0; i < 32; i++) {
                    if ((f & check_point) != 0) {
                        eql_count++;
                    }
                    check_point <<= 1;
                }
                if (eql_count != 1) {
                    System.out.println("eql_count " + eql_count + ", flag " + f + " is not valid!");
                    continue;
                }
                rec_flags |= f;
                continue;
            }
            System.out.println(f + " is not valid!");
        }
        allowedStatus = rec_flags;
    }


    public static void main(String[] args) {
        FlagStatsCode d1 = new FlagStatsCode("CASH", 1);
        FlagStatsCode d2 = new FlagStatsCode("WEIXIN", 2);
        FlagStatsCode d3 = new FlagStatsCode("ALI", 4);
        FlagStatsCode d4 = new FlagStatsCode("CARD", 8);
        FlagStatsCode d48 = new FlagStatsCode("48_WRONG", 48);
        FilterAggregator s = null;
        s = new FilterAggregator(new StatCodeEnumerator(new FlagStatsCode[]{d1, d2, d3, d4, d48}));
        s = new FilterAggregator(new StatCodeEnumerator(new FlagStatsCode[]{d1, d2, d3}));
        s = new FilterAggregator(new StatCodeEnumerator(new FlagStatsCode[]{d1, d3}));
        System.out.println(s.aggStatus(5));
        s = new FilterAggregator(new StatCodeEnumerator(new FlagStatsCode[]{d1, d2, d3, d4}));
        for (FlagStatsCode d : s.aggStatusDef(5)) {
            System.out.println(d.getStats() + " - " + d.getCode());
        }
    }
}


blog comments powered by Disqus
Flag Counter