Java获取新号码但忽略字母前面的数字

时间:2018-04-30 10:26:26

标签: java

我试图想办法解决我的问题。我没有找到完美的解决方案,我希望有人可以帮助我。

所以,我有一个标识符数组,如: ... 3113, 3114, 3115 A1, 3115 A2, 3116 ...

我想返回下一个可插入的号码。 目前我正在使用此功能但由于某种原因它不起作用我认为因为它正在读取数字3115 A1为31151。 在这个例子中,我想返回3117。

这是JAVA中的功能:

  public String getNewNumber(){
    int lastNumber = 1;
    for(String number : listNumbers){
      if(Integer.parseInt(number.replaceAll("[^\\d.]", "")) > lastNumber){
        lastNumber = Integer.parseInt(number);
      }
    }
    int newNumber = lastNumber + 1;
    return newNumber + "";
  }

2 个答案:

答案 0 :(得分:1)

除了替换字母,您应该使用split来提取数字,这样可以在字符串更改时删除许多可能的错误。这要求字符串中的第一个数字是您要提取的数字。

public String getNewNumber(String[] listNumbers) {
    int lastNumber = 1;
    for (String listNumber : listNumbers) {
        String splitNumber = listNumber.split("\\D")[0];
        int parsedNumber = Integer.parseInt(splitNumber);
        if(parsedNumber > lastNumber) {
            lastNumber = parsedNumber;
        }
    }
    int newNumber = lastNumber + 1;
    return String.valueOf(newNumber);
}

答案 1 :(得分:1)

number.replaceAll("[^\\d.]", "")
它将替换字符串中的所有非数字编号,因此3115 A1变为31151。因此,不要从输入数字中替换所有非数字字符,而是找到第一个非数字字符并获取子字符串。

String getNewNumber(String[] listNumbers) {

    int lastNumber = 1;
    for (String number : listNumbers) {
        int index = firstNonDigitIndex(number);
        int numberInt = Integer.parseInt(number.substring(0, index));
        if (numberInt > lastNumber) {
            lastNumber = numberInt;
        }
    }
    int newNumber = lastNumber + 1;
    return Integer.toString(newNumber);
}

/**
 * Returns index of first non-digit char in string or str.length()
 */
int firstNonDigitIndex(String str) {

    for (int i = 0; i < str.length(); i++) {

        if (!Character.isDigit(str.charAt(i))) {
            return i;
        }
    }
    return str.length();
}

此外,如果您的输入listNumbers已排序(似乎来自您的示例),那么您不需要迭代所有数字,只需解析最后一个数字。