【问题标题】:splitting strings in an array-list Java在数组列表 Java 中拆分字符串
【发布时间】:2016-09-17 17:32:45
【问题描述】:

我有一个包含日期的ArrayList。所有日期均采用以下格式:

“日月时区年”。示例如下所示,Wed Aug 10:15:17 AST 2016

我需要在第二个“:”处拆分字符串。这是我的代码。

int dateSize = date.size();
int i = 0;
ArrayList<String> splitDate = new ArrayList<String>();
splitDate.clear();
while(i < dateSize) {
    String[] splitString = date.get(i).split(":" + 1);
    splitDate.add(splitString[0]);
    Log.i("info", String.valueOf(splitDate));
    i++;
}

ArrayList 包含大约 50 个项目。起初,这段代码有效。它将这个打印到日志中,

9 月 14 日星期三 23:30,这就是我想要的。

然后,它随机开始打印这个,

2016 年 9 月 14 日星期三 23:30、9 月 14 日星期三 23:24:36 AST 2016、9 月 14 日星期三 23 日、9 月星期三 14 月 22 日,周三 9 月 14 日 22 日,周二 9 月 13 日 22 日,周二 9 月 13 日 22 日,周二 9 月 13 日 22:07:33 AST 2016,20 年 9 月 12 日星期一

有时它会拆分第二个“:”,有时它会拆分第一个“:”,有时它不会拆分任何内容。我无法弄清楚为什么会这样。如果我将代码更改为此,

String[] splitString = date.get(i).split(":");
splitDate.add(splitString[0]);

它完美无缺。一切都像这样打印到日志中,8 月 10 日星期三,没有例外。

我的方法正确吗?

【问题讨论】:

  • 因为你用这个来分割":" + 1
  • 你应该改用日期和 simpleDateFormatter,这会让你的生活更轻松......
  • @ΦXocę웃Пepeúpaツ 但是分裂会更快恕我直言。 :)

标签: java android arrays split


【解决方案1】:

好吧,首先这不是你想要的

String[] splitString = date.get(i).split(":" + 1);

这是对字符串 ":1" 的拆分

您要做的是在“:”上拆分,然后获取数组中的前两个条目并将它们连接起来

String[] splitString = date.get(i).split(":");
splitDate.add(splitString[0] + ":" + splitString[1]);

【讨论】:

    【解决方案2】:

    正如其中一位 cmets 所说,你的问题是这条线

    String[] splitString = date.get(i).split(":" + 1);
    

    本质上,您将把“:1”作为参数传递给 split()。因此,您最终会选择“:1”的第一个实例,或者如果“:1”不存在,则选择整个字符串。例如:

    • 8 月 10 日星期三:15:17 AST 2016 将于 8 月 10 日星期三
    • 周三 8 月 10:25:17 AST 2016 将给出周三 8 月 10:25
    • 星期三 8 月 10:25:25 AST 2016 将提供星期三 8 月 10:25:25 AST 2016

    如果你知道字符串的格式,那么我会这样做:

    String dateStr = date.substring(0, 13)
    

    如果您不知道字符串的格式(例如,它们是由可能拼写错误的用户输入的),那么我会用正则表达式检查它们。

    【讨论】:

      【解决方案3】:

      使用replaceFirst 方法有点复杂。

      ArrayList<String> splitDate = new ArrayList<String>();
      for (String dateItem : date) {
          String output = dateItem.replaceFirst("^(\\w{3}\\s\\w{3}\\s\\d{2}:\\d{2}):\\d{2}\\s\\w+\\s\\d+$", "$1");
          splitDate.add(output);
          Log.i("info", output);  
      }
      

      【讨论】:

        【解决方案4】:

        如果您有一个格式为“Wed Aug 10:15:17 AST 2016”的字符串数组元素,并且您使用“:”进行分割/分隔,您将得到以下字符串数组:

        [0] Wed Aug 10
        [1] 15
        [2] 17 AST 2016
        

        如果您查看上面的数组,您无法通过拆分字符串然后添加组件来完成您想要的“Wed Aug 10 15:17”输出(即:您将错过上面示例中的“17” , 因为它属于元素 [2])。

        我不是 Java 开发人员,所以语法可能有点偏,但是如果你想生成“Wed Aug 10 15:17”,那么我相信你正在寻找这个:

        String[] splitString = date.get(i).split(":");\\remove "1" from your delimiter
        String tempString = splitString[2].substring(0,1);
        splitDate.add(splitString[0] + " " + splitString[1] + ":" + tempString);
        

        在上面的 sn-p 中,tempString 行从拆分字符串数组元素 [2] 中获取前两个字符。然后将前两个数组元素与 tempString(即:17)相加并获得输出。

        编辑:我只想提一下,如果您可以控制日期字符串的输入,我建议您使用不同的分隔符。使用“:”会导致分隔符在字符串中也作为有效的非分隔符字符存在的问题。假设输入不受您/您的方法控制,上述代码 sn-p 应该可以工作。

        【讨论】:

          【解决方案5】:

          您始终可以使用java.util.StringTokenizer 类。 考虑到dateArrayList 包含String 格式的日期,以下代码行将添加所需格式的日期。

          StringTokenizer dateString = new StringTokenizer(date.get(i), ":");
          splitDate.add(dateString.nextToken() + ":" + dateString.nextToken());
          

          够简单!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-02-12
            • 1970-01-01
            • 2017-09-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多