根据出现次数的最大值对数据组合进行排序

时间:2018-08-31 18:51:26

标签: delphi

我从Rest Response适配器获得的内存表中具有RGBA值的数据组合,如下所示:

"R", "A"
"B"
"A","R"
"R","G"
"B"
...

我需要根据出现的最大次数对这些数据进行排序,或者在表内重复。例如,值"R","A" = "A","R表示此值的计数为2,依此类推。

我当时正在考虑使用Dictionary,但是它没有一种方法来计算值并考虑RA = AR。而且,如果我为每个值循环,都将花费很长时间,那么我应该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

似乎您有一些非常具体的内容。在这种情况下,您可以使用位操作对其进行优化:

type
  TCounts = array[0..15] of Integer;

const 
  RGBA_R = 1;
  RGBA_G = 2;
  RGBA_B = 4;
  RGBA_A = 8;

function GetCounts(const Strings: array of string): TCounts;
var
  i, j, k: Integer;
  s: string;
begin
  Fillchar(Result, Sizeof(Result), 0);
  for i := 0 to Length(Strings) - 1 do
  begin
    k := 0;
    s := Strings[i];
    for j := 1 to Length(s) do
      case s[i] of
        'R': k := k or RGBA_R;
        'G': k := k or RGBA_G;
        'B': k := k or RGBA_B;
        'A': k := k or RGBA_A;
        '"', ' ', ',': ; // do nothing
      else
        // handle error here
      end;

    Inc(Result[k]);
  end;
end;

R, G, B的所有组合的总数为Result[RGBA_R or RGBA_G + RGBA_B]