if else 很多怎么办????有什么替代的!(主要是字符串判断)if(str.equal("1")){}else if(str.equal("1")){}else if(str.equal("1")){}else .......太多了!写得我没话说了!

解决方案 »

  1.   

    如果全是数据或字符,,可以用switch-case替代啊。
    如果是没的。也没什么好办法
      

  2.   

    不好意思,上面我只是举个例子~~~就是类似下面的情形,如果有N个那就要写N个IF,太不爽了~~~
    if(str.equal("other1")){}else if(str.equal("other2")){}else if(str.equal("other3")){}else .......
      

  3.   

    code=Java]
    switch(str.charAt(0)
    {
       case '1':
       ………
    }[[/code]
      

  4.   

    如果str确定是一个整数的话,可以先转换成int,然后用switch。
    否则的话,就视情况而定了。
    你可将完整代码贴上来,大家帮你想想办法优化。
      

  5.   

    与其写成 str.equals("1") 不如写成 "1".equals(str)
      

  6.   

    可以建立一个字符型或整形元素的数组与字符串数组一对一匹配。然后把if..else if...else替换成switch
    ruby的话switch就可以用字符串。
      

  7.   

    我做这个是因为要做一个指令处理的方法:String cmd=request.getParameter("cmd");if(cmd.equal("download")){
    log.info("下载");
    }else if(cmd.equal("upload")){
    log.info("上传");
    }else if(cmd.equal("getList")){
    log.info("获取列表");
    }else if(cmd.equal("register")){
    log.info("注册");
    }else if(cmd.equal("sort")){
    log.info("排序");
    }else if(.......就是类似上面的形式,用switch不行啊:
    1.字符串
    2.不是可以转换成int的字符串
    3.用字符串中的某个字符也不行,可能出现重复
      

  8.   

    忘记加代码标签了~~~重复一次~~~
    String cmd=request.getParameter("cmd"); if(cmd.equal("download")){ 
    log.info("下载"); 
    }else if(cmd.equal("upload")){ 
    log.info("上传"); 
    }else if(cmd.equal("getList")){ 
    log.info("获取列表"); 
    }else if(cmd.equal("register")){ 
    log.info("注册"); 
    }else if(cmd.equal("sort")){ 
    log.info("排序"); 
    }else if(....... 
    就是类似上面的形式,用switch不行啊: 
    1.字符串 
    2.不是可以转换成int的字符串 
    3.用字符串中的某个字符也不行,可能出现重复
      

  9.   

    你说的这种用enum就能写得很漂亮了。(JDK>=1.5)
      

  10.   


    谢谢你的提醒,这样可以防止NULL异常!
      

  11.   


    如果你想用switch的话.可以在页面选择的时候带一个值嘛.在实现里处理下嘛.
      

  12.   

    可以考虑使用switch
      switch (Integer.parseInt(str){
           case 1:{ 
               ...       
            break;
           }
           case 2:{
               ... 
            break;
           }
           case ...
           }
    不过这个方法有局限性,只能case整形或者能转变为整形的条件。如果条件比较复杂,就只能用你那个代码
      

  13.   

    String[] cmds={"download","getList","register","sort","upload"...}
    //要保证cmds是有序的.
    int index=Arrays.binarySearch(cmds,cmd);log.info(cmds[index]);
      

  14.   

    可以把对应关系写在properties文件里,或者直接定义成一个hashmap也行,性质是一样的,就是做个映射
    //
    download=下载
    //...//String str="download";
    log.info(map.get(str));
      

  15.   

    最多,在log.info(cmds[index])之前对index做一下判断.
      

  16.   

    转换成INT或者序号,做switch...case...
      

  17.   

    这样写可以换成switch了,但是如果cmds里有插入,删除还是需要修改switch的。
    不如自定义enum类。
    然后写成这样:
    switch(CMD_ENUM.parse(cmd_string)) {
    case CMD_ENUM.DOWNLOAD:...
    case CMD_ENUM.REGISTER:...}
      

  18.   

    其实用case写也不见得清晰多少,只是性能好些。
    如果你是struts的action,可以使用DispatchAction, 如果有必要的话也可以仿照它的做法自己写个工具类
      

  19.   

    看过一篇文章说if else与switch的效率都不好,最好的是goto label.
      

  20.   

    改一下:String[] cmds={"download","getList","register","sort","upload"...} 
    String[] chineseCmds={"下载","获取列表","注册","排序","更新"....
    //要保证cmds是有序的. 两者对应
    int index=Arrays.binarySearch(cmds,cmd); log.info(chineseCmds[index]);
    20楼的办法可行.做一Map,挺简单。
      

  21.   

    用enum啊,
    也可以考虑用Map
      

  22.   


    可以做一Map。做对应关系,使用的时候直接取就可以了。
      

  23.   

    map
         应该不错的选择
      

  24.   

    呃大家可能又误解了!!!
    用IF判断后并不只是输入日志,还有相应的业务代码啊!!真是不好意思!!
    String cmd=request.getParameter("cmd"); if(cmd.equal("download")){ 
        log.info("下载"); 
        /*下面是下载的处理代码*/
    }else if(cmd.equal("upload")){ 
        log.info("上传"); 
        /*下面是上传的处理代码*/
    }else if(cmd.equal("getList")){ 
        log.info("获取列表"); 
        /*下面是获取列表的处理代码*/
    }else if(cmd.equal("register")){ 
        log.info("注册"); 
        /*下面是注册的处理代码*/
    }else if(cmd.equal("sort")){ 
        log.info("排序"); 
        /*下面是排序的处理代码*/
    }else if(....... 
      

  25.   


    如果像这种的,用Map不就可以了吗。
      

  26.   

    个人觉得,使用那么多if else没什么问题,因为你的确有那么多条件要判断.如果非要不想用:
    String cmd=request.getParameter("cmd"); 
    this.getClass().getMethod(cmd).invoke(null);public void upload(){
        // upload...
    }
      

  27.   

    Map m = new HashMap();
    m.put("download","下载");
    m.put("upload","上传");
    ...
    m.put("sort","排序");Iterator ite = keySet().iterator(); 
    while(ite.hasNext()){
     String key = (String)ite.next();
     if cmd.equals(key){
      log.info(m.get(key).toString());
      break;
     }
    }
      

  28.   

    Map m = new HashMap(); 
    m.put("download","下载"); 
    m.put("upload","上传"); 
    ... 
    m.put("sort","排序"); Iterator ite = m.keySet().iterator(); 
    while(ite.hasNext()){ 
    String key = (String)ite.next(); 
    if cmd.equals(key){ 
      log.info(m.get(key).toString()); 
      break; 
      

  29.   

    先用一个enum,然后在里面加上各个字体串,最后switch,我用C#一般就这么做了
      

  30.   

    37楼的应该比较符合你的要求,不管如何实现,你始终是有那些条件的分支的,模块化是少不了的。可以按照37楼的,把对应的业务处理内容写入和判断的字符串相同的方法名内,利用java的反射机制,用Method对象的回调
      

  31.   

    if中的内容是相应的业务代码,最好应该根据具体的业务,分成多个文件写代码
    不同的业务cmd放在不同的文件中
    写个map不容易维护,要是你一旦出错,去查看cmd和业务之间是否对应也是个困难
    拆分cmd,就lz的写法我觉得不错啊,根据cmd去查看相关的业务很容易找到
      

  32.   


    你的意思是这样?
    public interface Myfunction{
        
    }public class Download implement Myfunction{}public class Register implement Myfunction{}
    ......//以下省略但是我怎样才能在收到cmd的时候选择不通的类啊?
      

  33.   


    嗯~~~如果没有其他方法只有用if else了~~
    其实我只是怕我知道的不够多,写了那么多if else浪费时间~~~
    用invoke()想法不错,但是因为每个方法的参数有可能不相同,就不好做了。
      

  34.   


    参数不同,你让它相同不就行了。Object[]做参数,方法里再转,或者你把request做参数,呵呵。
    不建议你用这方法。
    直接if else没什么不好地,而且便于阅读。
      

  35.   

    其实,就单纯说完成你的业务逻辑是没有问题。
    但是如果为了避免将来出现越来越多的if-else情况,就是说你可能会在后续过程中添加这样的配对组合,我推荐使用下command模式。把if中的条件和具体的行为变成方法封装起来,这样是比较好。程序员确实应该避免越来越多的if-else的情况,如果楼主也有这样的想法,可以去GOOGLE下命令模式。如果觉得模式比较麻烦,其实也没有什么关系
      

  36.   

    楼上的扯的太远了。
    if(str.equal("1")){}else if(str.equal("1")){}else if(str.equal("1")){}else .......
    结构已经很清晰了,能用switch代替更好,不能就用这个,再用Map什么的反而复杂化了。
      

  37.   

    goto关键字只能在从内层循环跳出外层循环的时候使用,其他地方严禁使用。
      

  38.   

    可以用Map把条件值存入,然后根据key去取?
      

  39.   


    然后
    Myfunction mf = Class.forName(cmd).newInstance();
    mf.xxxMethod();//接口里定义的方法。
      

  40.   

    java 里边标准的用法应该是然后 
    Myfunction mf = Class.forName(cmd).newInstance(); 
    mf.xxxMethod();//接口里定义的方法。
      

  41.   

    当然用switch-case了,这是第一个应该想到的,
      

  42.   


    if / else 多了嘛 可以用switch-case 嘛
      

  43.   

    老大你懂 switch-case 吗?
    只能是int和枚举 型 啊 
      

  44.   


    老大你懂 switch-case 吗?
    只能是int和枚举 型 啊 
      

  45.   

    定义个枚举类型,然后通过switch...case对不同的枚举做对应的处理。
      

  46.   

    这样的感觉就if else嘛~~还想那么多干什么呢,最多是下边的业务代码放到一个方法中去啊.
    if()
    方法一
    else if 
    方法二
    .....
      

  47.   

    超过三层if...else就要用switch,如果还是很多表明你的设计有问题
      

  48.   

    字符串 还这么多  当然选择switch啦
    楼上有很多好意见了 用map或者枚举 看楼主喜好了
      

  49.   

    决定用反射了~public ActionForward command(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws IOException {

    String cmd=request.getParameter("cmd").trim();//指令名,对应CommandProcess中的方法名
    /*
     * 指令列表
     * 下载文件:cmd=download&file=product/mlns/C053.gif&userid=1
     * 注册:cmd=register
     * 登陆:cmd=login&userid=1&psw=jh45dd
     * 修改密码:cmd=changePsw&userid=1&oldpswjh45dd&newpsw=kl8547
     */
    CommandProcess commandProcess=new CommandProcess(request,response);
    Method method = null;
    try {
    method = commandProcess.getClass().getMethod(cmd);
    } catch (SecurityException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (NoSuchMethodException e) {
    // TODO Auto-generated catch block
    log.info("找不到名为"+cmd+"的方法!请注意大小写!"+e.getMessage());
    }
    try {
    method.invoke(commandProcess);
    } catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (InvocationTargetException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return null;
    }
    import java.io.IOException;
    import java.util.HashMap;import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;import org.apache.log4j.Logger;import com.iwit.noteService.bean.User;
    import com.iwit.noteService.dao.DaoFactory;
    import com.iwit.noteService.util.FunctionUtil;/**
     *
     * @author luhang E-mail:[email protected]
     * @version 创建时间:Aug 18, 2009 11:46:33 AM
     * 
     */
    public class CommandProcess {
    Logger log = Logger.getLogger(CommandProcess.class);
    HashMap<String,String> configs=DaoFactory.getConfigDao().getAllConfig();
    HttpServletRequest request;
    HttpServletResponse response;
    public CommandProcess(HttpServletRequest request,
    HttpServletResponse response) {
    super();
    this.request = request;
    this.response = response;
    }
    /**
     * 
     *下载文件
     * @return 路径
     */
    public void download(){
    String result="Failure";
    try {
    int userid=Integer.parseInt(request.getParameter("userid"));
    result=configs.get("download_url")+request.getParameter("file");
    } catch (NumberFormatException e) {
    // TODO: handle exception
    }
    try {
    response.getWriter().write(result);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    log.info("Web相应异常!"+e.getMessage());
    }
    }
    /**
     * 用户注册
     * @return ID+PSW
     */
    public void register(){
    String result="Failure";
    String timmill=System.currentTimeMillis()+"";
    String psw=FunctionUtil.GenerateRandomStr();
    User user=new User(FunctionUtil.EncoderByMd5(psw),timmill);
    if(DaoFactory.getUserDao().insertUser(user)){
    log.debug("新用户注册成功!");
    user=DaoFactory.getUserDao().getNewUserByRe(timmill);
    result=user.getU_id()+"+"+psw;
    }else{
    log.info("新用户注册失败!");
    }
    try {
    response.getWriter().write(result);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    log.info("Web相应异常!"+e.getMessage());
    }


    public void login(){
    String result="Failure";
    try {
    int userid=Integer.parseInt(request.getParameter("userid"));
    String psw=request.getParameter("psw");
    User user=DaoFactory.getUserDao().getUserById(userid);
    if(user.getU_psw().equals(FunctionUtil.EncoderByMd5(psw))){
    log.debug("ID:"+userid+"登陆成功!");
    result="Logined";
    }else{
    log.info("ID:"+userid+"登陆失败,密码错误!");
    }
    } catch (NumberFormatException e) {
    // TODO: handle exception
    log.info("非法的用户ID!"+e.getMessage());
    }
    try {
    response.getWriter().write(result);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    log.info("Web相应异常!"+e.getMessage());
    }
    }

    public void changePsw(){
    String result="Failure";
    try {
    int userid=Integer.parseInt(request.getParameter("userid"));
    String oldPsw=request.getParameter("oldpsw");
    User user=DaoFactory.getUserDao().getUserById(userid);
    if(user.getU_psw().equals(FunctionUtil.EncoderByMd5(oldPsw))){
    String newPsw=request.getParameter("newpsw");
    user.setU_psw(FunctionUtil.EncoderByMd5(newPsw));
    if(DaoFactory.getUserDao().updateUser(user)){
    log.debug("ID:"+userid+"密码修改成功!");
    result="PswChanged";
    }else{
    log.debug("ID:"+userid+"密码修改失败!");
    }
    }else{
    log.info("ID:"+userid+"旧密码错误!");
    }
    } catch (NumberFormatException e) {
    // TODO: handle exception
    log.info("非法的用户ID!"+e.getMessage());
    }
    try {
    response.getWriter().write(result);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    log.info("Web相应异常!"+e.getMessage());
    }
    }
    //下面还有好多方法........
    }
      

  50.   

    这个一般这么做public static final int DOWN = 1 ;.....
    然后switch() case 所以传入变量的时候..建议放数字...如果嫌麻烦..就弄个map吧..map.put("down",1) ;前提说明这样做没效率而且告诉你个秘密java里面if (){} if (){} if (){} if (){} if (){} if (){}
    和 if(){} else if{} else if{} else if{} else if{} else if{}
    没有区别的..这样如果你不用switch..他会给你从头比到尾的....
      

  51.   

     接分
      String str="内容"
      List list=Arrays.asList("123","234","内容");
      if(list.contains("str")){
          sysout;
    }
      

  52.   

    与其写成 str.equals("1") 不如写成 "1".equals(str)
    很有道理的,不要小看,能防止空指针!!
      

  53.   

    看来你的Struts没学好啊,直接用DispatchAction不就得了,将parameter配置为cmd
    调用直接就是xxx.do?cmd=命令
    或者自己写个Action,支持 xxx/命令.do格式的不就行了,这么麻烦啊
      

  54.   


    呃~~~注意看这个,我用的就是DispatchAction,自定义的Action方法command:
    public ActionForward command(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response)
                throws IOException {
            
            String cmd=request.getParameter("cmd").trim();//指令名,对应CommandProcess中的方法名
            /*
             * 指令列表
             * 下载文件:cmd=download&file=product/mlns/C053.gif&userid=1
             * 注册:cmd=register
             * 登陆:cmd=login&userid=1&psw=jh45dd
             * 修改密码:cmd=changePsw&userid=1&oldpswjh45dd&newpsw=kl8547
             */
            CommandProcess commandProcess=new CommandProcess(request,response);
            Method method = null;
            try {
                method = commandProcess.getClass().getMethod(cmd);
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                log.info("找不到名为"+cmd+"的方法!请注意大小写!"+e.getMessage());
            }
            try {
                method.invoke(commandProcess);
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }我说的是在方法里面怎么避免大量的if else语句,如果都用DispatchAction中的方法更不好吧~~
      

  55.   


        Map m = new HashMap(); 
        m.put("download","下载"); 
        m.put("upload","上传"); 
        ... 
        m.put("sort","排序"); 
        Iterator ite = m.keySet().iterator(); 
        while (ite.hasNext()) { 
             String key = (String)ite.next(); 
             if (cmd.equals(key)) { 
                 log.info(m.get(key).toString()); 
                 break;
             }
        } 
      

  56.   

    Map m = new HashMap(); 
    m.put("download","下载"); 
    m.put("upload","上传"); 
    ... 
    m.put("sort","排序"); Iterator ite = m.keySet().iterator(); 
    while(ite.hasNext()){ 
    String key = (String)ite.next(); 
    if cmd.equals(key){ 
      log.info(m.get(key).toString()); 
      break;