Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удалить повторы слов 
:(
    Опции темы
ufo
Дата 4.1.2005, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



есть строковая переменная, например, str.
В ней есть текст:
Код

str:='Str1 Str2 Str3 Str1 Str4 str2 Str3';

необходимо удалить все повторные слова из этой переменной, как это сделать?
То есть должно быть:
Str1 Str2 Str3 Str4 str2.
Регистр значение имеет.
PM MAIL   Вверх
Akella
Дата 4.1.2005, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Вопрос не очень понятен, но попробуй использовать такую функуию

Код


function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;
объявлена в модуле SysUtils

type TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);

rfReplaceAll Replace all occurrences. If this flag is not present, only the first occurrence of the target substring is replaced.

rfIgnoreCase Match occurrences of the substring case-insensitively. If this flag is not present, only case-sensitive matches are considered.


Код

например, удалить все повторения буквы э

s2,s1:String;
...
s2:='авпапваэ вапвапэ вапавээээек вапвапээ'
s1:=StringReplace(s2,'э','',[rfReplaceAll, rfIgnoreCase]);

Добавлено @ 14:28
Посмотри модуль StrUtils, в справке есть описание всех функций

Это сообщение отредактировал(а) dsergey - 4.1.2005, 14:26
PM MAIL   Вверх
Snowy
Дата 4.1.2005, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Самый простой и тупой способ:
Берешь первую подстроку, сатем, начиная со второй перебираешь все до конца. И, если совпадает, вырезаешь. Затем вторую, третью и т.д.

Если очередность не важна, то можно нарезать все в TStringList, затем его отсортировать. Потом пробегаешь от начала до Count-1 (только смотри - Count будет меняться) и, если новая строка равна предыдущей, убиваешь ее. Затем обратно собираешь в строку и ура!
Это IMHO самый простой по реализации способ.
PM MAIL   Вверх
ufo
Дата 5.1.2005, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



tnx всем smile
PM MAIL   Вверх
ufo
Дата 5.1.2005, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



Snowy, а если повтор слов имеет значение?
PM MAIL   Вверх
Snowy
Дата 5.1.2005, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Повтор как раз и имеет значение.
Если порядок имеет значение, то придется не сортировать список, а сравнивать все вручную. Берем первую строку и перебираем все строки, начиная со следующей. Если одинаковые - убиваем строку.
Либо воспользоваться первым вариантом - то же самое, но без использования StringList, а юзая свою функцию разбиения на части и вырезая через delete.
Через сортировку конечно проще. Но порядок нарушается...
PM MAIL   Вверх
ufo
Дата 5.1.2005, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



Я хотел написать порядок smile
Добавлено @ 12:46
Впрочем мне тут подкинули исходничок, так что вопрос снят.

PM MAIL   Вверх
Akella
Дата 5.1.2005, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



так давай его сюда
PM MAIL   Вверх
ufo
Дата 6.1.2005, 03:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 4.11.2004

Репутация: нет
Всего: нет



Код

Const S = 'Str4 Str1 Str2 Str3 Str1 Str4 str2 Str3 Str1 Str4';
Var Str: TStringList;
   t,r: Integer;
   Result: String;
begin
Result:='';
Str:=TStringList.Create;
With Str Do
 try
  Text:=StringReplace(S,#32,#13#10,[rfReplaceAll]);
  For t:=0 to Count - 1 Do Objects[t]:=Pointer(t);
  With TStringList.Create Do
   try
    Sorted:=True;
    Duplicates:=dupIgnore;
    Assign(Str);
    Result:='';
    For r:=0 to Str.Count - 1 Do
     For t:=0 to Count - 1 Do
      IF Objects[t] = Str.Objects[r] then
       Result:=Result + Str[r] + IfThen(r <> Count - 1,#32,'');
   finally
    Free;
   end;
 finally
  Free;
 end;
ShowMessage(Result);
end;

не очень конечно, но что дали.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1203 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.