String将null值赋入数组以使用if语句

时间:2013-06-16 17:35:02

标签: java string split

这是场景。 用户输入3种输入:

  1. 1/1/2013 12:00:00 AM_5/31/2013 12:00:00 AM
  2. 1/1/2013 12:00:00 AM_
  3. _5/31/2013 12:00:00 AM
  4. 输入用于日期范围查询。

    第一个输入:由_分隔符拆分:分为开始日期和结束日期。

    第二个输入:由_分隔符分割:输入只是开始日期。

    第三个输入:由_分隔符分割:输入只是结束日期。

    通过通用返回类型检索输入。

    if (StringUtils.endsWithIgnoreCase(searchKey, "date")) {
        String dates[] = searchValue.split("_",-1);
    
        if (dates [0] == null)
        {
            long epoch = System.currentTimeMillis()/1000;
            String format = "MM/dd/yyyy HH:mm:ss aaa";
            dates[0] = new     
            java.text.SimpleDateFormat(format).format(new java.util.Date (epoch*1000));
        }
        else if (dates [1] == null)
        {
            Date dNow = new Date( );
            dates[1] = DateFormat.getInstance().format(dNow);
        }
    
        String start = dates[0];
        String end = dates[1];
        String format = AppConstant.DATE_FORMAT;
        filters.add(String.format("%s between to_date('%s', '%s') and to_date('%s', '%s')", columnKey, start, format, end, format));
    } 
    

    正如您所看到的,整个想法是:

    1. 如果用户未输入开始日期,则纪元日期将用作开始日期。
    2. 如果用户未输入最后日期,则当前日期n时间将用作结束日期。
    3. 但不幸的是,这种编码不起作用。我猜测问题是Split不存储NULL值,因此if语句不起作用。

      我还是比较新的java,非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

dates将没有空条目,它将具有空字符串条目。

System.out.println("_foo".split("_", -1)[0].equals(""));//true

因此,使用String.equals方法

测试空字符串
if ("".equals(dates[0]) { ...

答案 1 :(得分:0)

坦率地说,我认为有一种更简单的方法可以解决这个问题:

1. if searchValue ends with '_'
   then end date = now, parse substring from 0 to length - 1 into date
2. if searchValue starts with '_'
   then start date = epoch, parse substring from 1 to length into date
3. else, split on '_',
   then require two pieces returned by split, parse into dates

我会留给你翻译成Java。

答案 2 :(得分:0)

如果您必须以这种方式接收用户输入(使用您描述的三种可能模式),那么我建议使用正则表达式(正则表达式)来匹配模式的各个部分。

例如:

String user_supplied_date_range_string =
        "1/1/2013 12:00:00 AM_5/31/2013 12:00:00 AM";
Pattern date_range_pattern = Pattern.compile(
        "^([0-9]{1,2}/[0-9]{1,2}/[0-9]{4} "
        + "[0-9]{1,2}:[0-9]{2}:[0-9]{2} (?:A|P)M)?_"
        + "([0-9]{1,2}/[0-9]{1,2}/[0-9]{4} "
        + "[0-9]{1,2}:[0-9]{2}:[0-9]{2} (?:A|P)M)?$");
Matcher matcher = date_range_pattern.matcher(
        user_supplied_date_range_string);

这将创建一个适合您描述的三种模式的正则表达式模式,然后运行正则表达式匹配器来处理用户提供的日期范围字符串,以查看用户的输入是否适合。

现在您可以检查结果以查看模式的第一个和/或第二个部分是否匹配:

if (matcher.matches()) {
    if (matcher.group(1) != null) {
        System.out.println("Start date found: " + matcher.group(1));
    }
    if (matcher.group(2) != null) {
        System.out.println("End date found: " + matcher.group(2));
    }
} else {
    System.out.println("User input does not match date range pattern.");
}

如果第一组和第二组都为空,则用户输入根本不适合该模式。

有关详细信息,请参阅java.util.regex package docs