配列のなかから指定した順位のものをとりだす


GUN  2010-02-26 00:05:37  No: 37768

題名の通り、配列のなかから一番大きな値、2番目に大きな値
など○番目という引数を渡してその値を取り出せるような関数ってありますか?

よろしくお願いします。


monaa  2010-02-26 01:29:49  No: 37769

ありません。
自分で実装しなくてはなりません。


KHE00221  2010-02-26 02:36:38  No: 37770

ほれ

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm4 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
  end;

  ERangeError = class(Exception)
  public
    ErrorCode: Integer;
  end;

resourcestring
   SOutOfRangeBuffer = 'Indexが配列の範囲を超えています';
   SDataNothing      = 'その順位のデータは存在しません';

var
  Form4: TForm4;

implementation

{$R *.dfm}

function Get(Buffer: array of Integer;Index: WORD): Integer;
var
    I,J,K: Integer;
    E: ERangeError;
begin

    //範囲チェック
    if (Index < (High(Buffer)-Low(Buffer))+2 ) and (Index > 0) then
    begin

      //ソート(データ量が多ければ QuickSort にでも変更)
      for I:= Low(Buffer) to High(Buffer) do
      begin
        for J:= Low(Buffer) to High(Buffer) do
        begin
          if Buffer[I] > Buffer[J] then //大きい順
          begin
            K := Buffer[I];
            Buffer[I] := Buffer[J];
            Buffer[J] := K;
          end;
        end;
      end;

      //取り出す
      I := Low(Buffer);
      J := 1;
      while (Index <> 0) and (I <= High(Buffer) ) do
      begin
        if Buffer[I] <> Result then
        begin
          Result := Buffer[I];
          Dec(Index);
          Inc(J);
        end;
        Inc(I);
      end;

      //該当するデータが存在しない
      if Index <> 0 then
      begin
        E := ERangeError.CreateRes(@SDataNothing);
        E.ErrorCode := 2;
        raise E;
      end;

    end
    else
    begin
      //配列の範囲外が指定された
      E := ERangeError.CreateRes(@SOutOfRangeBuffer);
      E.ErrorCode := 1;
      raise E;
    end;

end;

procedure TForm4.Button1Click(Sender: TObject);
var
    Buffer: array[10..17] of Integer;
    I: Integer;
begin
    Buffer[10] := 20;     // 2
    Buffer[11] := 10;     // 4
    Buffer[12] := 30;     // 1
    Buffer[13] := -15;    // 6
    Buffer[14] := 20;     // 2
    Buffer[15] := 15;     // 3
    Buffer[16] := 10;     // 4
    Buffer[17] := -10;    // 5
    (*
    Buffer[10] := 1;     // 2
    Buffer[11] := 2;     // 4
    Buffer[12] := 3;     // 1
    Buffer[13] := 4;    // 6
    Buffer[14] := 5;     // 2
    Buffer[15] := 6;     // 3
    Buffer[16] := 7;     // 4
    Buffer[17] := 8;    // 5
    *)

    for I:=0 to 10 do
    begin
      try
        Memo1.Lines.Add (IntToStr(I)+' = '+IntToStr(Get(Buffer,I)));
      except
      end;
    end;

end;

end.


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加