【问题标题】:Convert string to List<Long>将字符串转换为 List<Long>
【发布时间】:2013-11-25 15:40:06
【问题描述】:

我有一个逗号分隔值的字符串,我直接从数据库中获取。现在我想将整个字符串传递给另一个查询,但所需的数据类型很长,我想使用 in 子句来完成这项工作。

str1 = [123,456,789];

有没有直接的方法来代替循环。

【问题讨论】:

  • 据我所知,唯一的方法是循环。我会将它们存储在 O(N*M) 的 LinkedList 中,其中 M 是每个数字的长度(将字符串转换为 long 的成本),N 是元素的数量
  • 你能显示你试图运行的查询吗?这是什么关系型数据库?
  • 当您说“逗号分隔值”时,您指的是 .csv 文件格式,还是为人类消费而编写的数字,每组 3 位数字之间使用逗号约定?
  • @user2986404 如果您询问带有 IN 子句的字符限制:请在此处查看stackoverflow.com/questions/1869753/…
  • 或者如果你可以使用 jdbctemplate:stackoverflow.com/questions/1327074/…

标签: java


【解决方案1】:

您可以尝试以下代码从字符串中获取长值

如果 str1="123,456,789"

 Long x=Long.parseLong(str1.replace(",",""));

和,

如果 str1="[123,456,789]"

Long x=Long.parseLong(str1.replace(",|\\[|\\]",""));

【讨论】:

  • 是的,如果它用于整个字符串,但如果它用于有效的 long 则不是。
  • @RobinGreen 问题是关于一个包含, 的字符串,而不是如何解析一个long
【解决方案2】:

guava:

List<Long> longs = Lists.newArrayList(Iterables.transform(Splitter.on(',').split("1,2,3"), new Function<String, Long>() {
    public Long apply(final String in) {
        return in == null ? null : Longs.tryParse(in);
    }
}));

编辑:

使用List&lt;String&gt; (stringList) 作为输入:

List<Long> longs = Lists.newArrayList(Lists.transform(stringList, new Function<String, Long>() {
    public Long apply(final String in) {
        return in == null ? null : Longs.tryParse(in);
    }
}));

【讨论】:

  • 嗨 Robin,当我传递字符串时,这给了我 numberFormatException。实际上它的 List 我从 toString() 方法更改为 String 。或者有没有办法可以直接使用 List 更改为 List
【解决方案3】:

我怀疑您是否可以在不循环的情况下执行此操作。这是一个示例解决方法:

String str = "[123,456,789]";


Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(str);

List<Long> list = new ArrayList<Long>();

 while (matcher.find()) {
System.out.println(matcher.group());
list.add(Long.parseLong(matcher.group())); // Add the value to the list
}
System.out.println(list);

【讨论】:

    【解决方案4】:

    使用 String.replace 假设 str1 包含“[123,123,123]”

    str1 = str1.replace(",|\\[|\\]",""); //should replace commas and brackets with nothing;
    

    那么你应该可以做到

    Long myLong =  Long.parseLong(str1);
    

    【讨论】:

    • 我假设提问者是指.csv 文件格式意义上的逗号分隔值,而不是为人类消费而编写的数字,每 3 位数之间有逗号,但你可能是对的!
    【解决方案5】:

    使用 StringTokenizer 并通过 while 循环将拆分标记添加到列表中。

    StringTokenizer st = new StringTokenizer("1,2,3", ",");
    List<Long> list = new ArrayList<Long>();
    while (st.hasMoreTokens()) 
    {
         list.add(Long.valueOf(st.nextToken()));
    }
    

    【讨论】:

      【解决方案6】:

      您可以使用 Java 8 的 Lambda 函数来实现此目的而无需循环

          String string = "1, 2, 3, 4";
          List<Long> list = Arrays.asList(string.split(",")).stream().map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());
      

      【讨论】:

      • 稍微改进的版本:Stream.of(input.split(",")).map(s -> Long.parseLong(s.trim())).collect(Collectors.toList( ));
      【解决方案7】:

      比 virag 的答案略短,因为它跳过 asList() 并且不进行字符串修剪。

      List<Long> list = Arrays.stream(str.split(",")).map(Long::valueOf).collect(Collectors.toList());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-06
        • 2020-12-02
        • 2019-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-18
        • 1970-01-01
        相关资源
        最近更新 更多