【问题标题】:Convert Comma Separated Values to List<Long>将逗号分隔值转换为 List<Long>
【发布时间】:2012-06-18 14:37:25
【问题描述】:

假设我有一组像1,2,3,4,5,6,7 这样的数字作为单个String 输入。我想将这些数字转换为 ListLong 对象,即 List&lt;Long&gt;

谁能推荐最简单的方法?

【问题讨论】:

    标签: java


    【解决方案1】:

    你的意思是这样的?

    String numbers = "1,2,3,4,5,6,7";
    
    List<Long> list = new ArrayList<Long>();
    for (String s : numbers.split(","))
        list.add(Long.parseLong(s));
    
    System.out.println(list);
    

    从 Java 8 开始,您可以将其重写为

    List<Long> list = Stream.of(numbers.split(","))
            .map(Long::parseLong)
            .collect(Collectors.toList());
    

    如果您想获得List&lt;String&gt;,请使用较短的版本

    List<String> fixedSizeList = Arrays.asList(numbers.split(","));
    List<String> resizableList = new ArrayList<>(fixedSizeList);
    

    或单行

    List<String> list = new ArrayList<>(Arrays.asList(numbers.split(",")));
    

    【讨论】:

    • 这个答案很老,但仍然相关,应该是公认的答案。
    【解决方案2】:

    使用的简单方便的解决方案(为了线程的完成):

    String str = "1,2,3,4,5,6,7";
    List<Long> list = Arrays.stream(str.split(",")).map(Long::parseLong).collect(Collectors.toList());
    
    System.out.println(list);
    

    [1, 2, 3, 4, 5, 6, 7]

    更好的是,使用Pattern.splitAsStream():

    Pattern.compile(",").splitAsStream(str).map(Long::parseLong).collect(Collectors‌​.toList());
    

    【讨论】:

      【解决方案3】:
      String input = "1,2,3,4,5,6,7";
      String[] numbers = input.split("\\,");
      List<Integer> result = new ArrayList<Integer>();
      for(String number : numbers) {
          try {
              result.add(Integer.parseInt(number.trim()));
          } catch(Exception e) {
              // log about conversion error
          }
      }
      

      【讨论】:

      • 在 java 或 apache commons 或任何其他工具中是否有任何可用的实用方法可以通过调用方法以简单的方式获得结果?
      • 您可以使用一些基于访问者模式的appache或guava集合将String转换为Integer,但这不会使代码变得简单。这会使它更难阅读。
      【解决方案4】:

      您可以使用String.split()Long.valueOf()

      String numbers = "1,2,3,4,5,6,7";
      List<Long> list = new ArrayList<Long>();
      for (String s : numbers.split(","))
          list.add(Long.valueOf(s));
      
      System.out.println(list);
      

      【讨论】:

        【解决方案5】:

        如果你不在 java8 上并且不想使用循环,那么你可以使用Guava

        List<Long> longValues = Lists.transform(Arrays.asList(numbersArray.split(",")), new Function<String, Long>() {
                        @Override
                        public Long apply(String input) {
                            return Long.parseLong(input.trim());
                        }
                    });
        

        正如其他人提到的 Java8,您可以使用 Streams。

        List<Long> numbers = Arrays.asList(numbersArray.split(","))
                              .stream()
                              .map(String::trim)
                              .map(Long::parseLong)
                              .collect(Collectors.toList());
        

        【讨论】:

        • 可以用Arrays.stream(numbersArray.split(","))Stream.of(numbersArray.split(","))代替Arrays.asList(numbersArray.split(",")).stream()
        • @UtkuÖzdemir 实际上不能。在这种情况下,Lists.transform 不能用于将 String 转换为 Long。
        • 我指的是 java8 解决方案,而不是番石榴解决方案。
        【解决方案6】:

        我最近使用了以下:

        import static com.google.common.collect.ImmutableList.toImmutableList;
        import com.google.common.base.Splitter;
        import com.google.common.collect.ImmutableList;
        ...
        
            final ImmutableList<Long> result = Splitter.on(",")
                .trimResults()
                .omitEmptyStrings()
                .splitToStream(value)
                .map(Long::valueOf)
                .collect(toImmutableList());
        

        这使用来自 Guava 的 Splitter(处理空字符串和空格)并且确实 不要使用surprising String.split()

        【讨论】:

          【解决方案7】:

          我会使用优秀的 google 的 Guava 库来完成它。 String.split 会带来很多麻烦。

          String numbers="1,2,3,4,5,6,7";
          Iterable<String> splitIterator = Splitter.on(',').split(numbers);
          List<String> list= Lists.newArrayList(splitIterator );
          

          【讨论】:

          • 不要使用标准Java(因此不是最简单的方法),也不能解决问题。
          • 要么这个答案不正确,要么@Kathir 的问题不正确。
          • @jocelyn String.split can cause many troubles. 如....?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-20
          • 1970-01-01
          • 1970-01-01
          • 2021-09-27
          • 2012-12-02
          相关资源
          最近更新 更多