社区
Java SE
帖子详情
-------->>>>高分求教有趣的过滤规则的实现问题<<<<<<------
purecoffee
2005-11-20 06:42:55
过滤条件(最大9999999)
10的整数倍 如 :1000 12000
多连字重复号 如:88888 66666 556333
递增或递减号 如:98765 56789
双、多连字重复号 如:226699、667788、551188
只要是符合上面的数字,就跳过.
请高手指教
...全文
134
6
打赏
收藏
-------->>>>高分求教有趣的过滤规则的实现问题<<<<<<------
过滤条件(最大9999999) 10的整数倍 如 :1000 12000 多连字重复号 如:88888 66666 556333 递增或递减号 如:98765 56789 双、多连字重复号 如:226699、667788、551188 只要是符合上面的数字,就跳过. 请高手指教
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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的软件屏蔽好号?
这个如果不考虑效率应该非常简单啊。
精进:如何成为一个很厉害的人--作者:采铜
成功是一个让人爱恨交织的字眼,无数人为了所谓的成功变成了他们原本讨厌的人,而我更相信,只有坚持做一个你所喜欢的自己,你才可能
实现
真正意义 上的成功。 对刚打开本书,准备寻找更好的生活、成长和改变的...
WEB开发文档2 总结
http://blog.donews.com/lvjiyong/archive/2006/06/29/931071.aspx怎样将后台生成的在内存中的图象显示到客户端Microsoft IE WebControls下载...显示数据下载中文名文件时保存文件名乱码
问题
关于用ASP.net绘图的
问题
...
如何阅读一本书
提这些后续的事,是要指出这两部作品中所提到的一些阅读的
问题
,无论是好笑还是严肃的
问题
,都在我重写的书中谈到了,尤其是针对如何阅读一系列相关的书籍,并清楚掌握其针对同一主题相互补充与冲突的
问题
。...
《如何阅读一本书》
中所提到的一些阅读的
问题
,无论是好笑还是严肃的
问题
,都在我重写的书中谈到了,尤其是针对如何阅读一系列相关的书籍,并 清楚掌握其针对同一主题相互补充与冲突的
问题
。 在重写《如何阅读一本书》的种种...
我在CSDN参与的3000个帖子
求教
:如何在vb中结合sql语句
实现
对于access中表的复杂查询.最好还能让查询结果输出为excel 14: VBA请教怎样得知 某个宏里具体
实现
了那些操作? 15: 一道数学题,忘了算法,请各位大哥教我! 16: ...
Java SE
62,625
社区成员
307,257
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章