2009-09-30 3 views
0

Я просто застрял в проблеме (может быть, просто). Но я не могу понять, как его решить, может быть, кто-то из вас может мне помочь.Java Strings to Int

я получаю в качестве входных данных строку с этим форматом:

D0001001.tiff

И мне нужно вернуться следующий (учитывая, что следующий является полученным incremente фактором одного

. .

Вход: D0001001.tiff Выход: D0001002.tiff

нулей не может быть пропущено метод у меня есть это (без рефакторинга;))

private String getNextImageName(String last_image_name) 
{ 
    // Splits the name from the start to the . (not inclusive) 
    String next_name = last_image_name.substring(0, last_image_name.indexOf(".") - 1); 
    String next_extension = last_image_name.substring(last_image_name.indexOf(".") + 1, last_image_name.length() - 1); 

    String next_name_without_D = next_name.substring(1); 
    int next_name_withoud_D_value = Integer.parseInt(next_name_without_D); 

    // Increments to get the new name 
    next_name_withoud_D_value++; 

    String full_next_name = "D" + next_name_withoud_D_value + "." + next_extension; 

    return full_next_name; 
} 

Но результаты не так, как ожидалось:

Вход: D0002001.tiff Выход: D201.tif

-

Есть некоторые ограничения, например, число 0 не может исчезнуть, потому что в конечном итоге файл может зайца другой номер:

D0001001.tiff или D9999999001.tiff

но второй один идет только через 999

D0001001.tiff к D0001999.tiff

К этому моменту Я так застрял, что я не могу даже думать ...

Благодаря

ответ

2

Если бы использовать Regexp вместо того, чтобы сделать код немного чище:

private static final Pattern imgPattern = Pattern.compile("(.*)(\\d*)\\.(.*)"); 

public static String getNextImageName(String last) { 
    // The pattern captures the numerical value and the extension 
    Matcher matcher = imgPattern.matcher(last); 
    if (!matcher.matches()) { 
    throw new IllegalArgumentExecption("Not image pattern: " + last); 
    } 

    String prefix = matcher.group(1); 
    String num = matcher.group(2); 
    int numVal = Integer.value(num); 
    String ext = matcher.group(3); 

    return String.format("%s%0" + num.length() + "d.%s", 
       prefix, numVal + 1, ext); 
} 

Пара комментариев:

  1. Поиск Regexp спецификация чтобы понять закономерности и захватов. Данный шаблон в основном «возвращает» числовое значение, а расширение

  2. String.format() может форматировать номера и вставки 0 как пэд. String.format("%02d, 1) возвращает "01" в то время как String.format(%02d, 200) возвращает "200".

+4

Бросание ошибки кажется довольно интенсивным для плохого ввода. Почему не исключение IllegalArgumentException? – erickson

+0

Спасибо msaeed. Он работает отлично. Я даже не понимаю код. Но этот afteernoon я начну изучать регулярное выражение. Как кажется, очень мощный. – Sheldon

+0

Ужасный код по сравнению с ответом # 1 пенпингом. Почему люди переходят в Regex для таких решений? –

1
private static final Pattern p = Pattern.compile("D([0-9]+)(\\..+)"); 

private String getNextImageName(String previous) 
{ 
    Matcher m = p.matcher(previous); 
    if (!m.matches()) 
    throw new IllegalArgumentException("Invalid name: " + previous); 
    String number = m.group(2); 
    String ext = m.group(2); 
    String next = String.valueOf(Integer.parseInt(number) + 1); 
    int pad = Math.max(number.length() - next.length(), 0); 
    StringBuilder buf = new StringBuilder(1 + number.length() + ext.length()); 
    buf.append('D'); 
    while (pad-- > 0) 
    buf.append('0'); 
    buf.append(next); 
    buf.append(ext); 
    return buf.toString(): 
} 
3

Строка.формат может сделать трюк для заполнения части, например:

System.out.println(String.format("D%07d", 10)); 

дает

D0000010 
+1

Размер номера не фиксирован. Хорошая подсказка, хотя – notnoop

0
public String getNextImageName(String s) { 
    int t = Integer.parseInt(s.substring(1,8)); 
    return new Formatter().format("D%07d.tiff", (t + 1) % 2000).toString(); 
} 

Я не был уверен, что если вы говорили цифры, завернутые в 1999 году, если они не» t, вы должны вынуть % 2000.

+1

Проблема в том, что, как я упоминаю, количество символов внутри имени не фиксировано. Но этот класс очень полезен. – Sheldon

1
import static org.apache.commons.lang.StringUtils.*; 
import static java.lang.Long.*; 
import static java.lang.String.*; 

... 

String fileName = "D0009999.tiff"; 

String numericPortion = substringBetween(fileName, "D", ".tiff"); 
int minimumNumberOfDigits = numericPortion.length(); 
long numericValue = parseLong(numericPortion); 

String nextFileName = format("D%0" + minimumNumberOfDigits + "ds.tiff", ++numericValue); 
+0

это еще одно элегантное решение. И я это понимаю: D Cool SingleShot – Sheldon

+0

Хорошее решение. Решает эту проблему отлично. Не совсем здорово. – notnoop

+0

Спасибо msaeed. Что вы подразумеваете под «не совсем надежным»? Недостаток исключений формата обработки номера и что-то еще? Спасибо. – SingleShot