2011-11-15 9 views
2

要素の位置を変えずに、最小値から始まる整数の配列から要素を削除する関数を書いてみたいと思います。プログラミング言語はActionScript3です。AS3位置を変えずに配列から要素を削除

var aNumArr:Array = [0,7,2,5,9,0] 
    trace(RemoveMinValues(aNumArr, 1, false)) //output: 7,2,5,9,0 
    //trace(RemoveMinValues(aNumArr, -1, true)) //output: 0,7,2,5,9 
    //trace(RemoveMinValues(aNumArr, 2)) //output: 7,2,5,9 

(これらは、個々のトレース文です)私はsort(Array.NUMERIC)sort(Array.DESCENDING)を使用してアレイ内の最小値を削除するために管理しています。

しかし、要素を元の位置に戻す方法を理解できないようです。

これはの割り当てであるため、機能コード全体をコピーすることはできません。そして、私はあなたに正確な答えを教えてはいけないと思っていますが、むしろそれをやり遂げる方法について私に洞察を与えます。

私は十分にはっきりしていました。追加情報が必要な場合はお知らせください。

ありがとうございます。


編集:私は、私は機能上のいくつかのことを逃した実現。また、aNumArrと希望する出力値を変更して、私が望むものをより明確にしました。

そして、ここで私が以前にやったことだった:基本的に

function RemoveMinValues(aNumArr:Array, iMinsToRemove:int):void 
    { 
     if(iMinsToRemove >= 0) 
     { 
       aNumArr.sort(Array.NUMERIC); 
       for(var i:int = 0; i < iMinsToRemove; ++i) 
       { 
        aNumArr.shift(); 
       } 
     } 
     else 
     { 
       aNumArr.sort(Array.DESCENDING); 
       for(var i:int = 0; i > iMinsToRemove; --i) 
       { 
        aNumArr.pop(); 
       } 
     } 
    } 

aNumArr:Arrayは、指定された整数の配列です。 iNumbersOfMinsToRemove:intは削除する最小値の数です。 割当は私に返却を要求する何も

私はArray.NUMERICとArray.DESCENDINGが要素の位置を変更することは知っていますが、その位置を保持する方法については論理を理解できないようです。可能な限り簡単に保管してください。私はまだametureです。

+0

RemoveMinValues()の2番目の引数は何ですか? – Chris

答えて

1

値を削除する代わりに、nullに設定してください。さらに、ソートの順序は変わらないようにMath.NEGATIVE_INFINITYに設定してください。

そのように、配列のインデックスを使用すると、それが

0

まずを削除しないで、値を変更しているので、同じままMath.min()とMath.maxは()いずれかを取ることができることに注意します引数の数また、Functionオブジェクトで使用可能なapply()メソッドを理解することも重要です。これにより、配列を使用して関数に引数を渡すことができます。 「ループ」は、実際にネイティブコードを(Flash Playerの内側)を使用して実行されるので、それは純粋なActionScriptのループを使用して最小値または最大値を検索するよりも高速です:

var aNumArr:Array = [0,7,2,5,9]; 
var maxValue:Number = Math.max.apply(null, aNumArr); 
var minValue:Number = Math.min.apply(null, aNumArr); 

ここでは最良の部分です:のは、両方の利点を見てみましょう。

+0

いい考えです。それについては考えていませんでした:) –

+0

Pranav Hosangadi:ありとあらゆる –

+0

質問には答えませんが、「位置を変更して配列から要素を取り除く」とは言いませんが、私はdownvoteを保持します:) –

0

[編集]

他の人のためのスポイラブロックにコードを追加しました。


私が正しくあなたの質問を理解していれば、あなたはArray.filterを調査したいです。あなたが求めている質問が、各RemoveMinValuesパスの最終結果で絶対位置ではなく相対位置を保持する配列を返す必要がある場合は、フィルタメソッドが最も効果的です。

RemoveMinValues(arr) // [null,3,2,1,null] 
RemoveMinValues(arr, 1) // [null,3,2,null,null] 

相対位置:

ここ

は、以下の配列を指定して、差異がある、RemoveMinValuesに2番目の引数が最小値であると仮定すると、0

var arr:Array = [-1,3,2,1,0]; 

絶対位置にデフォルト設定

RemoveMinValues(arr) // [3,2,1] 
RemoveMinValues(arr, 1) // [3,2] 

次のRemoveMinValuesのメソッド実装では、 「相対的な」結果を提供する。しばらくお待ちください。Array.filterのドキュメントをお読みください。この特定の実装でRemoveMinValuesを呼び出すたびに、ドキュメントで定義されているように、元のものを変更せずに新しい配列が返されます。

コード:

target.filter(関数(アイテム:*、...引数):ブール{戻り項目>のminValue})。

この方法は、大きなデータセットでは遅くなります。 Vectorオブジェクトに切り替えると、パフォーマンスの問題が解決されます。

運が良かった!

関連する問題