将semver版本字符串(10.2.3)转换为long

时间:2014-04-02 12:35:57

标签: java regex string-parsing

这是一项有趣的任务......

给出了很多版本字符串 - 假设它们或多或少是语义版semantic version数字,如1.2.3 - 什么是将它转换为long(在Java中)的方式,因此它保持“1.2 .34“小于”12.3.0“?

这是我到目前为止所拥有的

public static Long toLong(String version) {
    if (version == null || version.isEmpty()) {
        return 0L;
    }
    String[] parts = version.split("[^0-9]");
    long number = 0L;
    long factor = 1;
    for (int b = parts.length - 1; b >= 0; b--) { 
        try {
            Long l = Long.parseLong(parts[b]);
            number += l * factor;
            factor = factor * 100;
        } catch (NumberFormatException e){
            // silently ignored
        }
    }
    return number;
}

假设字符串中的位置没有超过两位数(因此1.2.3.4567)将无法正常工作,但我可以忍受。但是我希望能有更快的东西。

1 个答案:

答案 0 :(得分:0)

您可以在String中执行类似的转换:

// add "." to format the major version
("." + versionString).
    // replace each "." with "a00"
    replaceAll("\\.", "a00").
    // keep 2 digits, remove "a" and extra leading "0"
    replaceAll("a0+([0-9]{2})", "$1");

该方法可以容易地用于输入字符串的不同数量的有效数字和/或不同格式。性能比你的toLong方法慢2.5倍(格式化1M版本字符串2.5秒)。如果性能比简单的代码更重要,那么比你的toLong方法快约5.5倍(1M字符串为0.2秒):

public static Long toLong2(String versionString)
{  
  if (versionString == null || versionString.isEmpty() )
  {  
    return 0L;
  } // end if empty
  char[] C = versionString.toCharArray();
  int i, i1 = 0, i2 = C.length;
  Long l, number = 0L, factor = 1L;
  try
  {
    for (i = C.length - 1; i > 0; i--)
    {  
      if (C[i] == '.')
      {  
        i1 = i + 1; 
        l = Long.parseLong(versionString.substring(i1, i2) ); 
        i2 = i; 
        number += l * factor;
        factor = factor * 100L;
      } // end if '.'
    } // end for i
    l = Long.parseLong(versionString.substring(0, i2) ); 
    number += l * factor;
    }  
  catch (NumberFormatException e) 
  {  
    // silently ignored
  } // end try
  return number;
} // end method toLong2