2015-01-28 6 views
1

Я пытаюсь реализовать компаратор для TreeMap, где ключевые элементы являются строками видаРасщепление буквенно-цифровых строк без deliminator

1a 
2b 
11a 
11b 
14 
16 

можно определить строки, которые нуждаются в дополнительной обработке достаточно легко, используя это регулярное выражение

[0-9]+[a-zA-Z]+ 

используя простой [0-9] + регулярные выражения можно найти начальное число на строке легко, мой вопрос, как я могу разделить эти вверх, чтобы мне потом сравнить целые значения и символы строки отдельно ?

Edit: Образец данных выше ожидаемого результата в идеале будет строка массива с позиции 0 является целым числом и позиция 1 является строковое значение т.е.

[1,a] 
[2,b] 
[11,a] 
[11,b] 
+0

Можете ли вы добавить некоторые образцы данных (как входных, так и ожидаемых результатов)? –

+0

Я думаю, вы можете поймать число и алфавитные элементы и обработать их после. – Eypros

ответ

2

Вот один подход, который использует регулярное выражение что вы предлагаете:

new Comparator<String>() { 
    Pattern p = Pattern.compile("([0-9]+)[a-zA-Z]+"); 

    private String getNum(String s) { 
     Matcher m = p.matcher(s); 
     return m.matches() ? m.group(1) : s; 
    } 

    @Override 
    public int compare(String o1, String o2) { 
     o1 = getNum(o1); 
     o2 = getNum(o2); 
     return Integer.compare(Integer.parseInt(o1), 
           Integer.parseInt(o2)); 
    } 
}; 

Если вы на Java 8, вы может сделать

private static Pattern p = Pattern.compile("([0-9]+)[a-zA-Z]+"); 
private static int getNum(String s) { 
    Matcher m = p.matcher(s); 
    return Integer.parseInt(m.matches() ? m.group(1) : s); 
} 

, а затем использовать

Comparator.comparing(YourClass::getNum)) 

Другой подход, который не использует регулярное выражение, что вы предлагаете это сделать

Comparator.comparing(s -> Integer.parseInt(s.replaceAll("[a-zA-Z]", "")))); 
+0

Спасибо, что это привело меня к решению, вместо того, чтобы использовать совпадение, я использовал find для определения того, что было в строке, и откуда я мог ее получить. Очень признателен – daark

Смежные вопросы