1

座標のリストを最初に x 座標で並べ替え、次に y 座標で並べ替えたい:

Orginal: (7,8)(10,22)(7,3)(5,10)(20,14)(7,10)(7,3)

First Step by x: (5,10)(7,8)(7,3)(7,10)(7,3)(10,22)(20,14)

Second Step by y: (5,10)(7,3)(7,3)(7,8)(7,10)(10,22)(20,14)

最初のステップで機能する関数が既にあります。

function SortCoords(Item1: Pointer; Item2: Pointer): Integer;
var
line1 : Coords;
line2 : Coords;
begin
  line1 :=  Coords;(Item1);
  line2 :=  Coords;(Item2);

  if (line1.X < line2.X) then 
    result := -1
  else if (line1.X > line2.X) then 
     result := 1
  else
     result := 0;

end; 

しかし、私は2番目のステップを取得しません。

4

3 に答える 3

7

アイテムをセカンダリ キーで並べ替えたい場合、これは最初のキーが等しい場合にのみ重要になります。あなたの例では、これがresult := 0;当てはまります。

だから、このようなもの:

if (line1.X < line2.X) then 
    result := -1
  else if (line1.X > line2.X) then 
     result := 1
  else if (line1.Y < line2.Y) then 
    result := -1
  else if (line1.Y > line2.Y) then 
     result := 1
  else
     result := 0;

あなたが望むことをするかもしれません。

于 2012-12-17T12:42:52.270 に答える
2
type
 TPC=Class
   x,y:Integer;
   Constructor Create(ax,ay:Integer);
 End;


function SortCoords(Item1: Pointer; Item2: Pointer): Integer;
var
line1 : TPC;
line2 : TPC;
begin
  line1 :=  TPC(Item1);
  line2 :=  TPC(Item2);

  if (line1.X < line2.X) then
    result := -1
  else if (line1.X > line2.X) then
     result := 1
  else
     begin
        if (line1.y < line2.y) then
          result := -1
        else if (line1.y > line2.y) then
          result := 1
        else result := 0;
     end;
end;

procedure TForm4.Button1Click(Sender: TObject);
var
  l:TList;
  I: Integer;

begin
  l := TList.Create;
  try
    l.Add(TPC.Create(7,8));
    l.Add(TPC.Create(10,22));
    l.Add(TPC.Create(5,10));
    l.Add(TPC.Create(20,14));
    l.Add(TPC.Create(7,10));
    l.Add(TPC.Create(7,3));
    l.Sort(SortCoords);
    for I := 0 to l.Count- 1 do
      begin
      memo1.lines.add(Format('x: %d  y: %d',[TPC(l[i]).x,TPC(l[i]).y]));
      TPC(l[i]).Free;
      end;
  finally
    l.Free;
  end;

end;

{ TPC }

constructor TPC.Create(ax, ay: Integer);
begin
   x := ax;
   y := ay;
end;
于 2012-12-17T12:51:30.383 に答える
2

「すぐに使える」Sort方法を使用できます。

出力

// data initialization 

Dump;

TArray.Sort<Coords1>(c1);
TArray.Sort<Coords2>(c2);
c3.Sort;

Dump;

だろう

7: [ (7; 8), (10; 22), (7; 3), (5; 10), (20; 14), (7; 10), (7; 3)]
7: [ (7; 8), (10; 22), (7; 3), (5; 10), (20; 14), (7; 10), (7; 3)]
7: [ (7; 8), (10; 22), (7; 3), (5; 10), (20; 14), (7; 10), (7; 3)]

7: [ (5; 10), (7; 3), (7; 3), (7; 8), (7; 10), (10; 22), (20; 14)]
7: [ (5; 10), (7; 3), (7; 3), (7; 8), (7; 10), (10; 22), (20; 14)]
7: [ (5; 10), (7; 3), (7; 3), (7; 8), (7; 10), (10; 22), (20; 14)]

データは

type
  Coord = Integer;
  Coords1 = record X,Y: Coord; end;  Coords2 = TPair< Coord, Coord >;
  CoordsList1 = array of Coords1;    CoordsList2 = TArray< Coords2 >;
  CoordsList3 = class (TList < Coords1 >) public function ToString: string; override; end;

var c1: CoordsList1; c2: CoordsList2; c3: CoordsList3;

完全なソースはhttp://pastebin.ca/2294517 にあります。「ネストされた if」比較関数はありませんが、必要に応じて指定できます。

于 2012-12-18T08:31:14.903 に答える