2010-08-27 3 views
1

Я хочу выполнить поиск и заменить с помощью java.Поиск на Java заменить

У меня есть TreeMap, который содержит имена файлов и их содержимое. У меня есть еще один TreeMap, содержащий слово и его значение.

Я хочу найти содержимое файла и заменить найденное слово его значением.

Благодаря

P.S: Это не уступка. Я использовал простой файл для чтения и заменил функцию. Однако мне нужен быстрый способ сделать это. Любой пример кода или ссылки. будут оценены.

+0

Домашнее задание? Что вы пробовали? – zigdon

+0

Чего вы хотите достичь? Что за вопрос? –

+0

lol .. Я слишком стар, чтобы делать домашнее задание :) Я читал один файл и выполнял нормальную функцию замены java. Это не хорошо для тысяч файлов. Я хочу использовать TreeMap для ускорения – Tweet

ответ

0

Этот пример будет работать для всех классов, реализующих интерфейс карты, а не только TreeMap:

public void searchAndReplace(Map<File, byte[]> fileToContentMap, Map<String, String> wordToDefinitionMap) { 

    // for each file 
    for (File f : fileToContentMap.keySet()) { 
     // get the file's contents 
     String contents = new String(fileToContentMap.get(f)); 

     // replace the contents with definitions 
     for (String word : wordToDefinitionMap.keySet()) { 
      contents = contents.replaceAll(word, wordToDefinitionMap.get(word)); 
     } 

     // make sure to update the contents in the array 
     fileToContentMap.put(f, contents.getBytes()); 

     // note, remember to update the physical file as well 

    } 
} 
+0

Спасибо за ваш пример. Это дало мне представление, и я решил свою проблему :) – Tweet

+0

У замены есть проблема с комбинированными словами, если у вас есть определение foo = something bar = blah и слово foobar, вы получаете что-то. Я думаю, вы должны разделить слова и сделать равные с ключами определения, чтобы этого не было. – extraneon

+0

Да, но «foobar» не равен «foo», и он не равен «bar», поэтому его не следует заменять. –

0

Основы могут быть:

  • петля над entrySet
  • для каждой записи получить значение
  • Split это значение в словах
  • для каждого слова поиска, что слово в словаре
  • если есть, то добавьте это слово в перевод строки stringbuilder
  • в противном случае добавить оригинал
  • добавить пространство или так
  • SetValue на записи карты с stringbuilder.toString
+0

Хорошая скорость? – Tweet

+0

@ пользователь431276 скорость не проблема, память потребление есть. Сохранение содержимого файла на карте не так уж и хорошо. Лучшая загрузка и сохранение в цикле над файлами и использование набора для файлов вместо карты. Я также разместил комментарий о выигрышном ответе о замене слова. – extraneon

1

Позвольте мне дать вам несколько общих советов развития, что помогает, когда проблема является подавляющим.

Прежде всего, запишите список - алгоритм, который, по вашему мнению, решит проблему. В вашем случае попробуйте:

  • для каждого файла в TreeMap 1
  • для каждой записи в этом файле
  • для каждой строки в текущем файле
  • поиска для каждого члена во втором TreeMap
  • для каждого найденного срока, замените это определение.

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

  • Итерации по списку файлов в TreeMap 1
  • открыть следующий файл
  • начала читать содержимое

Сделайте это для каждого шага, вы можете» t в настоящее время предвидеть «Just Coding», пока вы не увидите, как вы будете делать каждый шаг.

Как только вы закончите с этим, я предлагаю написать приложение Basic Basic, которое делает одну вещь из вашего списка - например, откройте файл. Здесь очень полезно написать тест юнита или написать тест в вашем основном. Убедитесь, что он открывает файл и может читать его.

Как только вы на этом этапе, продолжайте добавлять свой код - просто добавьте немного, а затем перекомпилируйте/повторите попытку. Повторите тест каждую строку, пока вы не закодированы как 5 лет, затем перейдите на каждые 2 или 3 строки.

Продолжайте обновлять свои тесты, чтобы проверить свой код. Если вы нарушите старый тест, перепишите его, не бросайте.

Iterate.

Надеюсь, это поможет.

+0

Ваш ответ напоминает мне о моем детстве (дни колледжа), когда они учили нас таким базовым * программирующим вещам :) в любом случае спасибо – Tweet

+0

хе-хе, возможно, так, как вы попросили, кто-то учил * базовый * программирование –

+0

Kinda звучал как домашняя проблема я - Извините, я неправильно понял. –

0

Я не хотел бы использовать TreeMap для хранения содержимого всех файлов +.
Вы все равно должны прочитать содержание, поэтому нет никакого преимущества при первом их хранении +.
Прочитайте один файл за раз, обработайте его и сохраните.

Посмотрите на пакет NIO Java. На NIO examples page приведен пример поиска в списке файлов (Grep.java).

+, если не требуется {} в другом месте

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