放两天假,昨天第一次去珠海的图书馆,然后又去体育中心。在宿舍闲的蛋疼。今天下午跑完4000米。跑完后感觉一个字爽。哈哈。回寝室的时候脑海中突然有个一闪而过的想法,发现很多的业务都要用到一个思想那就是标记。根据之前做过的题,我举出了下面四个例子来证明这个标记思想。
第一个例子:购物车
- javaweb中servlet实现:
//这是一个servlet 中用来进行购买的操作
protected void storelist (HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
String pid =request.getParameter("pid"); //得到双击后的编号
ArrayList<Adj_proBean> adjlist = (ArrayList<Adj_proBean>) request.getSession().getAttribute("adjlist");
if(adjlist==null){
adjlist=new ArrayList<Adj_proBean>(); //第一次创建 集合
}
boolean bl=false; //假设购物车中没有
for(int i=0;i<adjlist.size();i++){
if(adjlist.get(i).getpId().equals(pid)){
adjlist.get(i).setAdjAmount(adjlist.get(i).getAdjAmount()+1);
//改变数量
float a=adjlist.get(i).getAdjAmount()*Float.parseFloat(adjlist.get(i).getPrice());
adjlist.get(i).setAdjTotal(Float.toString(a)); //设置价格
bl=true; //标记状态表示找到了
break;// break 不再往后找了,提高效率
}
}
if(!bl)
// 购物车中没有该商品,则添加这种商品到购物车
{
Adj_proBean ab=new AdjustService().show_adj_info(pid);
ab.setAdjAmount(1);
float money=ab.getAdjAmount()*Float.parseFloat(ab.getPrice());
ab.setAdjTotal(Float.toString(money));
adjlist.add(ab);
}
request.getSession().setAttribute("adjlist", adjlist); //存到session中
}
第二个例子:求素数
C语言实现:
//这里举的例子是输出100之内的素数
void main()
{
int i,j;
int bl;
for(i=2;i<100;i++){
bl=1;//默认每个数都是素数
for(j=2;j<i;j++){
if(i%j==0){
bl=0; //只要有一个%j是0 就不是素数
break;
}
}
if(bl)
printf("%d\n",i);
}
}
分析:
根据这个例子,我们在web程序中可能会遇到这样一个业务,比如: 一个调整单据,记录一些商品进行调整情况,然后保存。但由于业务需求,可能那张调整单据,后期还要进行修改,或者再往那张单据中添加一些商品,则那张单据一些数据需要进行修改,一些数据需要进行往数据库中添加。这里,用此标记思想就可以解决这个问题。
解决:
以下是我的思路: 对单据里的商品进行添加或修改后,从session中得到新集合,把对象存到一个数组中, 然后再根据该单据编号从数据库中查出所有商品编号,放到字符串数组中。 接下来用两个for 循环判断就是啦。若被标记了就表示数据库中有,然后就对该编号的商品进行修改,如果没有标记就进行增加操作。 OK,一切都不是问题。
第三个例子:产生10个15以内不重复的数字。
C实现:
思路:既然要不重复的数字,这里我就想,产生过了,肯定要有个标记来记录这个数字产生过。若下次循环继续产生同一数字的话,就根据标记,跳过该循环,进行下一个。OK,思路有了,代码自然就出来了。
如下:
/* Note:Your choice is C IDE */
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
void main()
{
int arr[15]={1,0}; //默认0出现过,1-30都没出现过
int i,n;
srand(time(NULL));
for(i=1;i<=10;i++)
{
n=rand()%15;
if(arr[n]!=0){
i--;
continue;
//出现过则跳过
}
else{
printf("%d\t",n);
arr[n]=1;
//标记出现过
}
}
}
//我举这个例子的话是有原因的,记得有一次,我用javascript做了一个网页式数字拼图游戏,其中就要用到不同的随机数。所以,万变不离其中,可见标记思想的重要性了。
第四个例子:没有交作业的学生
Java 实现:
//这个例子真是突发奇想,有一天,有个学弟说,交了作业天天都要数数谁没教作业,于是,想法就有了,做一个检查没教作业的学生程序。
OK,下面是Java程序代码:
1、首先建立一个Student类,有属性name .有于较简单,这里省略该类的代码。
2、建立一个dao : 里面有方法
public
ArrayList<Student> initStudents(){
//这里是初始化学生。
}
//下面的这个方法是检查学生姓名,若存在则移除集合中的该学生。
public
static
boolean CheckStudent
(ArrayList<Student> stulist){
File file =new File("E:\\62班作业"); //这是指明要检查的文件夹
boolean bl=false;
if(file.isDirectory()){ //判断是否存在该文件夹
File[] files=file.listFiles(); //得到该目录下得文件
for(int i=0;i<files.length;i++){ //循环该文件夹
String stuName=files[i].getName(); //得到该文件夹的名字
Student stu=new Student(stuName);
for(int j=0;j<stulist.size();j++){ //循环集合中的名字
if(stulist.get(j).equals(stu)){ //如果包含该文件夹的名字
stulist.remove(stu); //移除集合中存在的学生名字
}
}
}
bl=true;
}else{
System.out.println("请检查的文件夹的命名是否为”88班作业”,注意路径应放在E盘");
bl=false;
}
return bl;
}
3、 建立一个Client 应用
public
static
void
main(String[] args) {
StudentDao sd=new StudentDao();
sd.initStudents(); //初始化学生
boolean bl=sd.CheckStudent(); //检查没交作业的学生
if(bl){
System. out .println( "没交作业的人数:" +stulist.size()+ " 信息如下↓" );for(int i=0;i<stulist.size();i++){ //查看没交的学生名单System.out.println(stulist.get(i).toString());}
}else{
System.
out
.println("要检查的文件夹不存在,请数据正确的路径");
}
}
//OK,这就是我的检查作业的程序,其核心原理就是查看文件夹名,然后和集合中的对象进行对比,如果相等,则把集合中的对象移除,最后集合剩下的就是没交作业的学生。
标记思想就先归纳到这里,以后我还有继续发一些关于技术上新的思路和总结。
2013-11-23 小高