我现在有这么一个需求,
就是一个编号,它的生成规则是:编号前缀+日期+4位的流水号,如文档200709250001
现在编号前缀是动态获得的,日期取当前日期,流水号自动更新累加。
我现在需要的结果是,如果改动编号前缀,4位流水号又重新从0001开始累加,改变日期我使4位的流水号从0001开始累加,如果做啊?用java实现。如现在的流水号是:文档200709250001  ....  文档200709250010   
现在编号前缀改变为“新闻”,那生成的编号变成   新闻200709250001 又从0001开始。
改变日期也是一样,
如今天是  文档200709250001  ....  文档200709250010
明天来如果编号前缀不变,那么将变成:   
从“文档200709260001”开始。

解决方案 »

  1.   

    //第一步,策略模式,生成编号
    public interface NoCreater{
      //根据最大的数据生成,
      //type:文档类型字符串;thedate:当前日期
      //maxNo为当前最大编号,如果当前文档.当前日期还没有编号,则参数为NULL
      public  String createNo(String filetype,String thedate,String maxNo);
    }
    //默认的生成编号算法,可以扩充
    public  class DefaultNoCreater implements NoCreater{
      public String createNo(String filetype,String thedate,String maxNo){
         if (maxNo == null)
           return filetype+thedate+'0001';
         //否则返回最后四位+1后与前面的字符串相连
         return ...
        
      }
    }//以下是生成编号所需基础数据生成器
    public interface NoCreaterBasicInfo{
      public String getType();
      public String getDate();
      public String getMaxNo();
    }
      

  2.   

    //最后一步,使用这些类
    public class CustomNoCreater extends DefaultNoCreater{
      
      private NoCreaterBasicInfo basicInfo;  public CustomNoCreater(NoCreaterBasicInfo basicInfo){
        this.basicInfo = basicInfo;
      }  public String getNo(){
        super.createNo(basicInfo.getType(),basicInfo.getDate(),basic.getMaxNo());
      }
    //先为NoCreaterBasicInfo生成一个默认基类
    public abstract class DefaultNoCreaterBasicInfo{
      public abstract String getType();
      
      public String getDate(){
        java.util.Date d = now();
        return d.getYear().toString+d.getMonth().toString()+d.getDay().toString();
      }  public String getMaxNo(){
      ...
      }
    }
    //以下为你使用常用类型
    public abstract class FileBasicInfo extends DefaultNoCreaterBasicInfo{
      public String getType(){
        return '文档';
      }
    }public abstract class FileBasicInfo{
      public String getType(){
        return '新闻';
      }
    }
      
    }
      

  3.   

    //最后一个错了
    public abstract class NewsBasicInfo extends DefaultNoCreaterBasicInfo{
      public String getType(){
        return '新闻';
      }
    }
      

  4.   

    static String test(String prev,String date){
    String curr ="新闻200709250010";
    String result =curr.substring(0,curr.indexOf("2"));
    String mid = curr.substring(curr.indexOf("2"),curr.indexOf("2")+8);
    String last = curr.substring(curr.indexOf("2")+8,curr.indexOf("2")+12);
    if(!prev.equals(result)){
    result = prev;
    last = "0001";
    }
    if(!date.equals(mid)){
    mid = date;
    last = "0001";
    }
    result = result + mid + last;
    System.out.println(result);
    return result;
    }
      

  5.   

    String date ="20070926";//parameter
    String prev ="新闻";//parameter
    test(prev,date);
      

  6.   

    LZ所说的需求,最后生成的编号是存在数据库中,还是文件中,还是内存中,不同的需求作法也可不同
    如果是数据库,
    可以select Max(your_no) from your_db where your_no like (your_prefix | your_date)
    如果取得到,就把后四位+1再凑成你要的字符串,如果取不到,就从1开始如果是文件,可以做一个properties文件
    prefix=xxx
    date=yyy
    sequence=zzz
    通过改变properties来获取新的编号如果是内存,那LS都说了
      

  7.   

    实现类:
    class SerialNumCreator{
    private static int currentNo = 1;
    private static String formattingDate = null;
    private static String prefix = null;

    public static String getSerialNum(String pre) {
    if(prefix == null){
    prefix = pre;
    } else if(!prefix.equals(pre)){
    currentNo = 1;
    prefix = pre;
    }

    DateFormat dateFormat = new SimpleDateFormat("yyyMMdd");
    String dateStr = dateFormat.format(new java.util.Date());
    if(formattingDate == null){
    formattingDate = dateStr;
    } else if(!formattingDate.equals(dateStr)){
    currentNo = 1;
    formattingDate = dateStr;
    }

    String serialNum = "000" + currentNo;
    currentNo ++;
    serialNum = prefix + formattingDate + serialNum.substring(serialNum.length() - 4);

    return serialNum;
    }
    }使用:
    String serialNum = SerialNumCreator.getSerialNum("Document");
     ....另外:
    如果上面的问题的答案是:流水号接着从“0011”计数,那么需要把各个前缀对应的当前流水号记录下来,比如放在一个Map里面
      

  8.   

    所以关键LZ你要明确你的需求,如果是希望保存在内存中,那就通过Hashmap去保存吧
    for exampleHashMap hm - new HashMap();
    ...
    `//生成编号
    String no = (String)hm.get(your_prefix);
    if (no == null) {
      hm.put(your_prefix, your_date + "," + "0001");
      return your_prefix + your_date + "0001";
    }
    String[] tmp = no.split(",");
    if (your_date.equals(tmp[0])) { //日期相同
        tmp[1] = ("0000" + (Integer.parseInt(tmp[1])+1));
        tmp[1] = tmp[1].subString(tmp[1].length-4, tmp[1].length);
        hm.put(your_prefix, your_date + "," + tmp[1]);
        return your_prefix + your_date + tmp[1];
    }
    hm.put(your_prefix, your_date + "," + "0001");
    return your_prefix + your_date + "0001";
      

  9.   

    上面DateFormat中"yyyMMdd"少写一个y,惭愧~
      

  10.   

    import java.text.SimpleDateFormat;
    import java.util.Date;import java.util.Scanner;public class createArrary {
        private String qianZui = "文档";    private String riQi = "20070925";    private int shuZi = 1;    public void outputNumber(String qZui, String rQi) {
            String temp = "";
            if (qZui.trim().equals(qianZui)) {
                if (rQi.trim().equals(riQi)) {
                    shuZi++;
                } else {
                    shuZi = 1;
                    riQi = rQi;
                }
            } else {
                qianZui = qZui.trim();
                shuZi = 1;
            }
            temp = qianZui + rQi;
            String stringShuZi = String.valueOf(shuZi);
            for (int i = stringShuZi.length(); i < 5; i++)
                temp = temp + "0";
            temp = temp + stringShuZi;
            System.out.println(temp);
        }    public static void main(String[] args) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            String date = sdf.format(new Date());
            createArrary ca = new createArrary();
            System.out.println("如想退出请输入exit");
            for (;;) {
                Scanner scan = new Scanner(System.in);
                String qianZui = scan.next();
                if (qianZui.trim().equals("exit")) {
                    break;
                } else {
                    ca.outputNumber(qianZui, date);
                }
            }
        }
    }