java 字符串比较大小

时间:2022-06-29 16:16:13
问题:使输入开始时间(kssj)为8:00,结束时间(jssj)为18:00能够保存成功;
      而输入开始时间(kssj)为8:00,结束时间(jssj)为6:00不能够保存成功;
代码如下:
    if (kssj.compareTo(jssj) < 0){
      //保存;
    } else {
      //报错:kssj应小于jssj;
    }
结果却总是都能保存成功。是怎么回事呢?

13 个解决方案

#1


补充:kssj和jssj都是字符型的

#2


kssj.compareTo(jssj) < 0
默认应该是以字符串的自然顺序来比较的
8 在 1 的后面
8 同样在 6的后面

#3


我想也是这个原因。能不能限制一下格式呢?还是不能用compareTo来比较?

#4


DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm");
Date ks= df.parse(kssj);
Date js= df.parse(jssj);
  if (ks<js){ 
      //保存; 
    } else { 
      //报错:kssj应小于jssj; 
    } 

#5


不行啊,提示:运行内部错误null

#6


没问题啊,打印出2,楼主的代码来瞧瞧

String kssj = "8:00";
        String jssj = "6:00";

        if (kssj.compareTo(jssj) < 0) {
            System.out.print("1");
        } else {
            System.out.print("2");
        }

#7


public DataTranVo Update(DataTran dt) throws Exception {
        conn = pool.getConnection();
        vo = new DataTranVo();
        cmd = new WdCommon();
        DateFormat dd = new SimpleDateFormat("yyyy-MM-dd hh:mm"); 
        Date ks = dd.parse(kssj);
        Date js = dd.parse(jssj);

            String sql = "";
            String params[] = {};
                try {
                    if (ks.compareTo(js) < 0){
                        boolean allowadd = cmd.AllowAdd("wd_wdmc",
                                " and wdbm = '" + wdbm +
                                "' and wdid !='" + pkid + "'");
                        if (allowadd) {
                            QueryRunner qr = new QueryRunner();
                            qr.update(conn, sql, params);
                            boolean issuccess = ///;
                            if (issuccess) {
                                DbUtils.commitAndClose(conn);
                                dt.sMessage = "成功!";
                            } else {
                                DbUtils.rollbackAndClose(conn);
                                dt.sMessage = "失败!";
                            }
                        } else {
                            dt.sMessage = "该单位已经存在代码为:" + wdbm +
                                          "的网点,请重新设置网点代码!";
                            DbUtils.close(conn);
                        }
                    } else {
                        dt.sMessage = "开始时间应小于结束时间!";
                        DbUtils.close(conn);
                    }
                    vo.setDataTran(dt);
                    return vo;
                } catch (Exception e) {
                   ///
                }
    }

#8


你这样写肯定是异常呀。
DateFormat dd = new SimpleDateFormat ("yyyy-MM-dd hh:mm"); 
那你的kssj必须是:2003-04-05 8:00这种形式的。

#9


时间前后还是calendar类吧

#10


引用 6 楼 kingssman 的回复:
没问题啊,打印出2,楼主的代码来瞧瞧 


Java codeString kssj = "8:00";
        String jssj = "6:00";

        if (kssj.compareTo(jssj) < 0) {
            System.out.print("1");
        } else {
            System.out.print("2");
        }



是。可是kssj = 8:00 ;jssj = 18:00,结果也是2啊。     

#11


当然,1和6(两个首字母)都比8小,所以不会报错,建议特别写一个比较的函数
 可以将时间转为int来比较

#12


字符串的比较是按顺序进行比较的(compareTo),比如:dsiejfg 和djifasln比较,会从左到右依次比较对应位置上的字母,为了更加明显的说明问题,我采用以下方式:
 1 2 3 4 5 6 7 8 9----序号
 d j i e j f g--------字符串一
 d j i f a s l n------字符串二
 0 0 0 -1       比较到第四位的时候,就不再往后比较了,后面的字符串大(其中的0代表相等,-1代表小于,1代表大于)

 同理,比较8:00、6:00、18:00时,是按以下方式进行比较:
 1 2 3 4 5  
 8 :0 0
 6 :0 0
 1      因为8的ASCII码大于6,所以返回结果是大于
 1 2 3 4 5  
 8 :0 0
 1 8 :0 0
 1      因为8的ASCII码大于1,所以返回结果也是大于
 所以,我认为解决方法可以将字符串分解为两部分,以“:”为分割符分割,然后转化为整数进行比较
 如:
 public class ZFBJ {
   public static void main(String args[])
   {
   String a="8:00";
   String b="6:00";
   String c="18:00";
   
   String[] a1=a.split(":");
   String[] b1=b.split(":");
   String[] c1=c.split(":");
   
   int a2=Integer.parseInt(a1[0]);
   int b2=Integer.parseInt(b1[0]);
   int c2=Integer.parseInt(c1[0]);
  
   if(a2>b2)
   {
   System.out.println("8:00大于6:00");
   }
   else
   {
   System.out.println("8:00小于6:00");
   }
   if(a2>c2)
   {
   System.out.println("8:00大于18:00");
   }
   else
   {
   System.out.println("8:00小于18:00");
   }
   }
}
 
结果:8:00大于6:00
     8:00小于18:00
这样应该就可以了!

#13


有道理,主要是这是字符串,老当着一个整体了,忘记字符串比较的本质过程了

#1


补充:kssj和jssj都是字符型的

#2


kssj.compareTo(jssj) < 0
默认应该是以字符串的自然顺序来比较的
8 在 1 的后面
8 同样在 6的后面

#3


我想也是这个原因。能不能限制一下格式呢?还是不能用compareTo来比较?

#4


DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm");
Date ks= df.parse(kssj);
Date js= df.parse(jssj);
  if (ks<js){ 
      //保存; 
    } else { 
      //报错:kssj应小于jssj; 
    } 

#5


不行啊,提示:运行内部错误null

#6


没问题啊,打印出2,楼主的代码来瞧瞧

String kssj = "8:00";
        String jssj = "6:00";

        if (kssj.compareTo(jssj) < 0) {
            System.out.print("1");
        } else {
            System.out.print("2");
        }

#7


public DataTranVo Update(DataTran dt) throws Exception {
        conn = pool.getConnection();
        vo = new DataTranVo();
        cmd = new WdCommon();
        DateFormat dd = new SimpleDateFormat("yyyy-MM-dd hh:mm"); 
        Date ks = dd.parse(kssj);
        Date js = dd.parse(jssj);

            String sql = "";
            String params[] = {};
                try {
                    if (ks.compareTo(js) < 0){
                        boolean allowadd = cmd.AllowAdd("wd_wdmc",
                                " and wdbm = '" + wdbm +
                                "' and wdid !='" + pkid + "'");
                        if (allowadd) {
                            QueryRunner qr = new QueryRunner();
                            qr.update(conn, sql, params);
                            boolean issuccess = ///;
                            if (issuccess) {
                                DbUtils.commitAndClose(conn);
                                dt.sMessage = "成功!";
                            } else {
                                DbUtils.rollbackAndClose(conn);
                                dt.sMessage = "失败!";
                            }
                        } else {
                            dt.sMessage = "该单位已经存在代码为:" + wdbm +
                                          "的网点,请重新设置网点代码!";
                            DbUtils.close(conn);
                        }
                    } else {
                        dt.sMessage = "开始时间应小于结束时间!";
                        DbUtils.close(conn);
                    }
                    vo.setDataTran(dt);
                    return vo;
                } catch (Exception e) {
                   ///
                }
    }

#8


你这样写肯定是异常呀。
DateFormat dd = new SimpleDateFormat ("yyyy-MM-dd hh:mm"); 
那你的kssj必须是:2003-04-05 8:00这种形式的。

#9


时间前后还是calendar类吧

#10


引用 6 楼 kingssman 的回复:
没问题啊,打印出2,楼主的代码来瞧瞧 


Java codeString kssj = "8:00";
        String jssj = "6:00";

        if (kssj.compareTo(jssj) < 0) {
            System.out.print("1");
        } else {
            System.out.print("2");
        }



是。可是kssj = 8:00 ;jssj = 18:00,结果也是2啊。     

#11


当然,1和6(两个首字母)都比8小,所以不会报错,建议特别写一个比较的函数
 可以将时间转为int来比较

#12


字符串的比较是按顺序进行比较的(compareTo),比如:dsiejfg 和djifasln比较,会从左到右依次比较对应位置上的字母,为了更加明显的说明问题,我采用以下方式:
 1 2 3 4 5 6 7 8 9----序号
 d j i e j f g--------字符串一
 d j i f a s l n------字符串二
 0 0 0 -1       比较到第四位的时候,就不再往后比较了,后面的字符串大(其中的0代表相等,-1代表小于,1代表大于)

 同理,比较8:00、6:00、18:00时,是按以下方式进行比较:
 1 2 3 4 5  
 8 :0 0
 6 :0 0
 1      因为8的ASCII码大于6,所以返回结果是大于
 1 2 3 4 5  
 8 :0 0
 1 8 :0 0
 1      因为8的ASCII码大于1,所以返回结果也是大于
 所以,我认为解决方法可以将字符串分解为两部分,以“:”为分割符分割,然后转化为整数进行比较
 如:
 public class ZFBJ {
   public static void main(String args[])
   {
   String a="8:00";
   String b="6:00";
   String c="18:00";
   
   String[] a1=a.split(":");
   String[] b1=b.split(":");
   String[] c1=c.split(":");
   
   int a2=Integer.parseInt(a1[0]);
   int b2=Integer.parseInt(b1[0]);
   int c2=Integer.parseInt(c1[0]);
  
   if(a2>b2)
   {
   System.out.println("8:00大于6:00");
   }
   else
   {
   System.out.println("8:00小于6:00");
   }
   if(a2>c2)
   {
   System.out.println("8:00大于18:00");
   }
   else
   {
   System.out.println("8:00小于18:00");
   }
   }
}
 
结果:8:00大于6:00
     8:00小于18:00
这样应该就可以了!

#13


有道理,主要是这是字符串,老当着一个整体了,忘记字符串比较的本质过程了