Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Вниз

Сортировка, с приоритетом на другие буквы   Найти похожие ветки 

 
DelphiN! ©   (2005-01-13 11:03) [0]

Нужно отсортировать строки, согласно своим приоритетам каждой буквы, например в обычной сортировке сначало ставиться буква A, а мне надо сначало скажем F, второй буквой в стандартной сортировке идет B, а мне надо скажем W и т.д

Вот накатал процедурку, где для каждой буквы можно ставить свой приоритет, согласно которому проходит сортировка, так-же 1-я буква главнее приорететом чем 2-я и т.д. Однако данная процедура работает не так, помоему моя ошибка либо в таблице приоритетов, либо в вычеслении приоритета, согласно номеру буквы в строке(Result := Result+GetAssoc(s[i])+Length(s)-(i);).

Вот вся ф-ия :

procedure _Sort(var strl: TStringList);
 //Получить приоритет слова
 function GetPrior(s: String): Integer;
   //Получить приоритет буквы
   function GetAssoc(c: Char): Integer;
   begin
     case c of
       "a": Result := (6*(60))*35;
       "b": Result := (5*(50))*35;
       "c": Result := (4*(40))*35;
       "d": Result := (3*(30))*35;
       "e": Result := (2*(20))*35;
       "f": Result := (1*(10))*35;

       "A": Result := (12*120)*35;
       "B": Result := (11*110)*35;
       "C": Result := (10*100)*35;
       "D": Result := (9*90)*35;
       "E": Result := (8*80)*35;
       "F": Result := (7*70)*35;
     end;
   end;
 var
   i: Integer;
 begin
   Result := 0;
   for i := 0 to Length(s) do
     Result := Result+GetAssoc(s[i])+Length(s)-(i);
 end;

 //Найти минимальное значение слова в стринглисте
 function FindMin(strl: TStringList): Integer;
 var
   i: Integer;
 begin
   Result := 0;
   for i := 0 to strl.Count-1 do
     if GetPrior(strl.Strings[Result]) < GetPrior(strl.Strings[i]) then
       Result := i;
 end;

var
 i,j,n: Integer;
 s: String;
 _strl: TStringList;
begin
 _strl := TStringList.Create;
 while strl.Count > 0 do
 begin
   //Найти слово с минимальным приоритетом
   i := FindMin(strl);
   //Добавить это слово в новый список
   _strl.Add(strl.Strings[i]);
   //Удалить это слово из основного списка
   strl.Delete(i);
 end;
 //присвоить значения нового списка старому
 strl := _strl;
end;

Пример :
var
 strl: TStringList;
begin
 strl := TStringList.Create;
 strl.LoadFromFile("C:\1.txt");
 _Sort(strl);
 strl.SaveToFile("C:\2.txt");
end;

Помогите довести ф-ию до рабочего состояния, ото уже голова не варит ...


 
KSergey ©   (2005-01-13 11:09) [1]

> DelphiN! ©   (13.01.05 11:03)  
> Помогите довести ф-ию до рабочего состояния, ото уже голова
> не варит ...

А может просто развеяться?


 
Alx2 ©   (2005-01-13 11:10) [2]

А не проще ли сначала заменить буквы согласно приоритетам, а потом, после сортировки, снова заменить их на исходные?


 
DelphiN! ©   (2005-01-13 11:11) [3]


>  [1] KSergey ©   (13.01.05 11:09)


Времени нет. :(


 
ЮЮ ©   (2005-01-13 11:13) [4]

function CrasyStringCompare(List: TStringList; Index1, Index2: Integer): Integer;
begin
 //Result := List.CompareStrings(List.FList^[Index1].FString,
                               List.FList^[Index2].FString);
 // вместо стандартных пишешь свои правила срвнения
end;

TCrasyStringList = class(TStringList)
public
 procedure Sort; override;

end;

procedure TCrasyStringList.Sort;
begin
 CustomSort(CrasyStringCompare);
end;


 
Anatoly Podgoretsky ©   (2005-01-13 12:09) [5]

DelphiN! ©   (13.01.05 11:11) [3]
А, ну тогда другое дело, отложи пока.


 
TUser ©   (2005-01-13 12:29) [6]

procedure Buble (var S: TSTringList);
var i, j: integer;

function ComnpareStr(S1, S2: string): shortint;
var i1, i2: integer;

 function GetValue(C: char): integer;
 begin
   // Это ты уже написал
 end;

begin
 i1:=1; i2:=1; f:=true;
 result:=0; // equal;
 while (result = 0) and
       (i1 <= length(S1)) and
       (i2 <= length(S2)) do
   if GetValue(S1[i1]) < GetValue(S2[i2]) then
     result:=-1
     else
   if GetValue(S1[i1]) > GetValue(S2[i2]) then
     result:=1
     else begin
//  if GetValue(S1[i1]) = GetValue(S2[i2]) then begin
     inc (i1); inc (i2);
     end;
end;

procedure Swap(I1, I2: integer);
var _s: string;
begin
  _s:=S[i1]; S[i1]:=S[i2];
  S[i2]:=_s;
end;

begin
 for i:=0 to S.Count-2 do
   for j:=S.Count-1 downto i do
     if CompareStr(S[i],S[j]) < 0 then
       Swap(i,j);
end;


 
DelphiN! ©   (2005-01-14 08:14) [7]

Всем огромное спасибо, все прекрасно заработало !



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.046 c
10-1082169149
Silver
2004-04-17 06:32
2005.01.30
Word шифровка


1-1106123275
Viruz
2005-01-19 11:27
2005.01.30
DecimalSeparator


6-1099995518
Sergey18
2004-11-09 13:18
2005.01.30
Определение изменения Web-страницы


3-1104140090
Tomkat
2004-12-27 12:34
2005.01.30
Создание БД с помощью ISQL.EXE


6-1100011528
MegaVolt
2004-11-09 17:45
2005.01.30
Как сделать для каждого пользователя подкл. к серверу свой слиент





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский