2016-11-11 17 views
1

Мне нужно заменить слово другим, не используя replace и replaceAll функции в тексте.Заменить слово другим, не используя функцию замены

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

Например: Я хочу заменить «один» на «тринадцать» в строке «У меня есть одна собака». Это то, что я пытался сделать (я использую RandomAccessFile класс):

RandomAccessFile r = new RandomAccessFile("toto.txt","rw") 
r.seek(position); // imagine that position is the right cursor which take place under the o from the word "one" 
r.writeBytes("thirteen"); 

Когда я пытаюсь это я стирать слова после того, как собака, потому что «тринадцать» больше, чем «один» ..

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

Как я могу продолжить?

+0

Какова конкретная причина, по которой вы не можете заменить?Это задание? У вас есть ограничения памяти? –

+0

Да, это задание. – ChrisBlp

+0

Что вам нужно изменить? Вам нужно изменить строку в памяти или файл? – Kenster

ответ

1

Это, как я хотел бы сделать это:

  • Для каждой строки в файле
  • Заменить то, что вы хотите в строке
  • запись строки во временный файл
  • Написать все обратно из временного файла в исходный файл

Если файл невелик, вы можете просто сохранить строки в памяти вместо записи во временном ry файл.

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

0

Попробуйте работать со строкой как с массивом: используйте https://en.wikipedia.org/wiki/Boyer -Moore_string_search_algorithm и замените символы. Конечно, вам нужно изменить длину массива.

0

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

Я не уверен, что это «лучшее» решение в любом случае, чем предлагалось Mats391. Это может быть самый короткий (но не самый простой) способ.

+0

Могу ли я вставить что-нибудь посередине с другим классом? Например, BufferedWriter? – ChrisBlp

1

Вы можете прочитать весь файл, а затем использовать String's replace. Есть два альтернативных исхода:

  1. новая строка короче - в этом случае мы подушечка строка в конце
  2. новая строка длиннее или такой же длины - это не должно быть проблемой, как RandomAccessFile будет расширьте файл.

Запишем newString из положения 0 - RandomAccessFile работает как массив и поэтому содержимое перезаписывается.

RandomAccessFile r = new RandomAccessFile("toto.txt","rw"); 

//read the content 
byte[] buffer = new byte[(int)r.length()]; 
r.read(buffer); 
String str = new String(buffer, "UTF-8"); 

//replace and pad right to get at least the same length 
String newString = str.replaceAll("one","three"); 
str = String.format("%1$"+str.length()+ "s", newString); 

//write back to the file 
r.seek(0); 
r.writeBytes(newString); 
r.close(); 
+0

Я понимаю, что ваш метод очень много, но я не могу использовать функцию replaceAll. На самом деле, цель моего задания - искать каждое слово, которое совпадает с другим (я реализовал данный алгоритм) и заменить его. В двух словах я должен сделать replaceAll работу по-своему. – ChrisBlp