过滤条件(最大9999999)10的整数倍 如 :1000 12000
多连字重复号 如:88888 66666 556333
递增或递减号 如:98765 56789
双、多连字重复号 如:226699、667788、551188只要是符合上面的数字,就跳过.
请高手指教
多连字重复号 如:88888 66666 556333
递增或递减号 如:98765 56789
双、多连字重复号 如:226699、667788、551188只要是符合上面的数字,就跳过.
请高手指教
最后一个规则没有实现,只要再写一个实现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;
}
}
就是数据并不是循环一次输出的,而是输入一个数字判断,是不是需要过滤,返回不需要过滤的一个数字. public int getNextId(int i){....}
这是一个id产生的过滤规则.
因为有多个条件我在想是不是要考虑递归才能实现.
例如:因为不满足第二个条件,产生一个新的数字,还要返回来检验第一个条件.
依次都是这样,知道所有条件都通过才可以.
一边解题一边教设计模式的代表!