2014-02-15 3 views
1

Я имеющий файл данных (.txt) строятся следующим образом:Удаления счетчиков в строке данных

AmountItem ItemName 
AmountItem ItemName 
... 

ItemName может содержать все символы, в том числе пробелов и специальных символов. AmountItem - целое число.

То, что я пытаюсь сделать, это получить List<String>, содержащий уникальные записи ItemName s, где каждый ItemName файла данных присутствует один раз.

Я пытался сделать это путем считывания файла с BufferedReader reader фильтрации каждую строку для ItemName следующим образом

List<String> test = new ArrayList<String>(); 
reader = new BufferedReader(...); 

while((line = reader.readLine()) != null){ 
    boolean noElement = true; 

    line = line.replace("\\d+ ",""); \\remove the amount 

    for(String str : test) 
     if(str.equals(line)) 
      noElement = false; 

    if(noElement) 
     test.add(line); 
} 

Все работает отлично, за исключением суммы каждого пункта не удаляется.

Я попытался удалить что-то из тестовых строк, например "12341 foo".replace("\\d","X"), который возвращает 12341 foo в качестве замененной строки. То же самое касается других подстановочных знаков регулярного выражения и управляющих символов, например. "12341 foo".replace("^1","X") возвращение "12341 foo". Однако замена одного символа в строке работает.

Что я сделал не так? Или есть более эффективный способ сделать это?

ответ

0

Я не знаю, есть ли более эффективный способ сделать это, но чтобы иметь возможность использовать регулярное выражение для замены, вам нужно использовать .replaceAll. Тем не менее, вы также должны изменить регулярное выражение немного, так что это не снимает слишком много символов:

line = line.replaceAll("^\\d+ ",""); 

^ соответствует началу строки, так что только первые числа (и пространства) удален.

+0

Более эффективный способ, вероятно, можно разделить на пространстве, удалить первый элемент в массиве результатов, а затем соединить их обратно пространство. – Jerry

0

В этом случае я бы просто использовать простой String.split(String, int) с limit из 2:

String[] parts = line.split(" ", 2); 
String amount = parts[0]; 
String name = parts[1]; 
+0

правый. в этом случае String.split ("", 2) ~ 20μs быстрее, чем string.replaceAll ("^ \\ d +", "") –

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