-------->>>>高分求教有趣的过滤规则的实现问题<<<<<<------

purecoffee 2005-11-20 06:42:55
过滤条件(最大9999999)

10的整数倍 如 :1000 12000
多连字重复号 如:88888 66666 556333
递增或递减号 如:98765 56789
双、多连字重复号 如:226699、667788、551188

只要是符合上面的数字,就跳过.
请高手指教
...全文
134 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinatelly 2005-11-26
  • 打赏
  • 举报
回复
反正你的过滤是有规则的,按照规则写代码是容易的。
liu_you 2005-11-26
  • 打赏
  • 举报
回复
jinxfei(周华健、言兴朋、茅威涛)的扩展性不错.GOOD!
一边解题一边教设计模式的代表!
jinxfei 2005-11-26
  • 打赏
  • 举报
回复
那你就自己组织代码来实现过滤过程了,反正规则是核心嘛。
别等着什么都让别人给你弄好呀。
purecoffee 2005-11-21
  • 打赏
  • 举报
回复
楼上的,有一点我没有说清楚,
就是数据并不是循环一次输出的,而是输入一个数字判断,是不是需要过滤,返回不需要过滤的一个数字. public int getNextId(int i){....}
这是一个id产生的过滤规则.
因为有多个条件我在想是不是要考虑递归才能实现.
例如:因为不满足第二个条件,产生一个新的数字,还要返回来检验第一个条件.
依次都是这样,知道所有条件都通过才可以.
jinxfei 2005-11-20
  • 打赏
  • 举报
回复
说明:
最后一个规则没有实现,只要再写一个实现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;
}
}
jinxfei 2005-11-20
  • 打赏
  • 举报
回复
你是不是要算彩票号码?
还是要为类似QQ的软件屏蔽好号?

这个如果不考虑效率应该非常简单啊。

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧