【问题标题】:Splitting String to list of Integers with comma and "-"使用逗号和“-”将字符串拆分为整数列表
【发布时间】:2014-07-08 11:30:51
【问题描述】:

是否有一种简单的方法可以将以下字符串解析为整数列表:

String s = "1,2,5-9,11,12"

// expected values list: [1,2,5,6,7,8,9,11,12]
List<Integer> values = magicallyGetListFromString(s);

我想知道是否有一种简单的方法可以做到这一点,而不是自己写。

【问题讨论】:

  • StringTokenizer 太复杂了?
  • 是的,写一些Java代码来解析它。您的具体问题是什么。
  • 我知道如何自己做(非常类似于@SteveL 的答案)。我正在寻找一个现有的代码来做到这一点......
  • @mxb: StringTokenizer 是一个遗留类,不鼓励在新代码中使用它。

标签: java string parsing


【解决方案1】:
List<Integer> out=new ArrayList<Integer>();
String numbers[]=s.split(",");
for(String part:numbers){
    if(part.contains("-"){
        int a=Integer.parseInt(part.split("-")[0]);
        int b=Integer.parseInt(part.split("-")[1]);
        while(a<=b){
             out.add(a++);
        }
    }else{
        out.add(Integer.parseInt(part));
    }
}

【讨论】:

    【解决方案2】:

    这应该可行:

    public class StringMagic
    {
        public static void main(String[] args)
        {
            String s = "1,2,5-9,11,12";
    
            // expected values list: [1,2,5,6,7,8,9,11,12]
            List<Integer> values = magicallyGetListFromString(s);
            for (Integer integer : values)
            {
                System.out.println(integer);
            }
        }
    
        public static List<Integer> magicallyGetListFromString(String s)
        {
            List<Integer> numberList = new ArrayList<Integer>(); 
            String[] numbers = s.split(",");
            for (String string : numbers)
            {
                if (!string.contains("-"))
                {
                    numberList.add(Integer.parseInt(string));
                }
                else
                {
                    String[] limits = string.split("-");
                    int bottomLimit = Integer.parseInt(limits[0]);
                    int upperLimit = Integer.parseInt(limits[1]);
                    for(int i = bottomLimit; i <= upperLimit; i++)
                    {
                        numberList.add(i);
                    }
                }
            }
            return numberList;
        }
    }
    

    【讨论】:

      【解决方案3】:
      public static void main(String[] args) {
          String str = "1,2,5-9,11,12,19-21";
          String[] val = str.split(",");
          List<Integer> l = new ArrayList<Integer>();
          for (String s : val) {
      
              if (s.contains("-")) {
                  String[] strVal = s.split("-");
                  int startVal = Integer.parseInt(strVal[0]);
                  int endVal = Integer.parseInt(strVal[1]);
                  for (int i = startVal; i <= endVal; i++) {
                      l.add(i);
                  }
              } else {
                  l.add(Integer.parseInt(s));
              }
          }
          for (int j : l) {
              System.out.println(j);
          }
      }
      

      O/P : 1 2 5 6 7 8 9 11 12 19 20 21

      【讨论】:

      • 我的猜测是它会保留 ,s 和 -s 但不会保留实际数字。
      【解决方案4】:

      你正在看的魔法

      public static List<Integer> magicallyGetListFromString(String s){
         String[] str=s.split(",");
         List<Integer> result=new ArrayList<Integer>();
         for(String i:str){
             if(i.contains("-")){
                 String[] ss=i.split("-");
                 int lower= Integer.parseInt(ss[0]);
                 int upper= Integer.parseInt(ss[1]);
                 for(int j=lower;j<=upper;j++){
                     result.add(j);
                 }
             }else {
                 result.add(Integer.parseInt(i));
             }
         }
          return result;
      }
      

      结果:

      [1, 2, 5, 6, 7, 8, 9, 11, 12]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多