Delphi 6のための組み込み関数はありますか?つまり、関数MaxValue
によって返された値のインデックスを取得する関数です。配列内の最大値のインデックスを見つけるにはどうすればよいですか?
最も効率的なルーチンは何ですか?
Delphi 6のための組み込み関数はありますか?つまり、関数MaxValue
によって返された値のインデックスを取得する関数です。配列内の最大値のインデックスを見つけるにはどうすればよいですか?
最も効率的なルーチンは何ですか?
デルファイではこのような機能は提供していません。デルファイ6ではなく、私が間違っていない限り、現代のDelphiバージョンでさえそうではありません。
配列の内容に関する情報がない場合、最大値と対応するインデックスを見つけるために各要素をチェックする必要があります。
uses
Math; // MaxDouble is defined by this unit
function IndexOfMaxValue(const x: array of Double): Integer;
var
Index: Integer;
MaxValue: Double;
begin
Result := -1;
MaxValue := -MaxDouble;
for Index := 0 to high(x) do begin
if x[Index]>MaxValue then begin
Result := Index;
MaxValue := x[Index];
end;
end;
end;
同点の場合、その最大値を持つ複数の要素であり、この関数は、最初のそのような要素のインデックスを返すことに注意してください。
@LURDが指摘しているように、配列内のすべての要素が-MaxDouble
の場合、関数は-1を返します。これは次のように扱うことができます:
function IndexOfMaxValue(const x: array of Double): Integer;
var
Index: Integer;
MaxValue: Double;
begin
if high(x) = -1 then begin
Result := -1;
end else begin
Result := 0;
MaxValue := x[0];
for Index := 1 to high(x) do begin
if x[Index]>MaxValue then begin
Result := Index;
MaxValue := x[Index];
end;
end;
end;
end;
okこれが私のやり方です。 thks – bbd
私はいつもCompareValue(Delphi 6で利用可能な場合)を比較演算子よりもdoubleを比較する際に使用する方が好きです。 –
@SebastianProske私はしません。 'MaxValue'は比較演算子を使うので、この文脈で使うのは間違ったことです。私はあなたのコメントが浮動小数点演算のやや曖昧な感謝に基づいていると思う。たとえば、これらの関数のどちらかを 'CompareValue'を使って書くとしたら、関数の出力は要素の順序に依存します。つまり、配列をシャッフルして、異なる値を返すことができます。あなたはそれを望んでいないでしょう。 –
どのようなデータ型の配列ですか? –
@GerryColl 'MaxValue'は浮動小数点データの配列で動作します –