过滤条件(最大9999999)10的整数倍 如 :1000 12000
多连字重复号 如:88888 66666 556333
递增或递减号 如:98765 56789
双、多连字重复号          如:226699、667788、551188只要是符合上面的数字,就跳过.
请高手指教

解决方案 »

  1.   

    说明:
    最后一个规则没有实现,只要再写一个实现Rule接口的类即可,并不困难。
    不是10的倍数的很多。java.io.File.listFile就使用了类似的设计模式,
    这里还用到了一个Chain of Responsiblity模式。
    public class Filter{
        public static void main(String[] args){
            RuleChain rc=new RuleChain();
            rc.addRule(new Div10Rule());
            rc.addRule(new RepeatRule());
            rc.addRule(new IncDecRule());
            for(int i=0; i<=9999999; i++){
                rc.accept(i);                
                
            }
        }
    }class RuleChain{
        java.util.ArrayList rules=new java.util.ArrayList();
        public void addRule(Rule rule){
            rules.add(rule);
        }
        public boolean accept(int num){
            boolean acceptable=true;
            for(int i=0; i<rules.size();i++){
                Rule r=(Rule)rules.get(i);
                if (!r.accept(num)){
                    System.out.println("跳过: "+num+"\t原因:"+r.getRuleName());
                    return false;
                }
            }
            return true;
        }
    }interface Rule{
        public boolean accept(int num);
        public String getRuleName();
    }class Div10Rule implements Rule{
        public String getRuleName(){
            return "不能是10的整数";
        }
        public boolean accept(int num){
            return !((num % 10)==0);
        }
    }class RepeatRule implements Rule{
        public String getRuleName(){
            return "不能有三个以上连续数";
        }
        public boolean accept(int num){
            
            int originalNum=num;    //调试用变量
            int maxRepeat=0;
            int curRepeat=0;
            
            int lastDigit=num % 10;
            num= num / 10;
            while(num>0){
                
                int curDigit=num % 10;
                
                num=num /10;
                
                if (curDigit==lastDigit){
                    curRepeat++;
                }else{
                    curRepeat=0;
                }
                if (curRepeat>maxRepeat){
                    maxRepeat=curRepeat;
                }
                //System.out.println(""+originalNum+",last "+lastDigit+", cur "+curDigit+", maxr "+maxRepeat+", curR "+curRepeat);
                lastDigit=curDigit;
                
            }
            
            return maxRepeat<3;
        }
    }class IncDecRule implements Rule{
        public String getRuleName(){
            return "不能是顺子";
        }
        public boolean accept(int num){
            //先用最后一位减去第一位,决定总体上是该判递增还是递减
            //因涉及每位操作,转成字符串比较合适
            //还可以使用每次取一位的算法,然后看每一位和最后一位的差的绝对值是否依次递增即可。
            
            String numStr=""+num;
            int step=0;
            if (numStr.charAt(0) > numStr.charAt(numStr.length()-1)){
                //递增
                step=1;
            }else{
                step=-1;
            }
            
            for(int i=0; i<numStr.length()-1;i++){
                if (!((
                    Integer.parseInt(""+numStr.charAt(i))-
                    Integer.parseInt(""+numStr.charAt(i+1)))==step)){
                    return true;
                }
            }        
            return false;
        }
    }
      

  2.   

    楼上的,有一点我没有说清楚,
    就是数据并不是循环一次输出的,而是输入一个数字判断,是不是需要过滤,返回不需要过滤的一个数字. public int getNextId(int i){....}
    这是一个id产生的过滤规则.
    因为有多个条件我在想是不是要考虑递归才能实现.
    例如:因为不满足第二个条件,产生一个新的数字,还要返回来检验第一个条件.
    依次都是这样,知道所有条件都通过才可以.
      

  3.   

    jinxfei(周华健、言兴朋、茅威涛)的扩展性不错.GOOD!
    一边解题一边教设计模式的代表!