これは、データを設定するための実際には良い方法ではありません。入力が多すぎます (「records」、「medinc」、「statename」を何度も繰り返していますが、間違いなく回避できたはずです。たとえば、次のようになります。
var records:Array = [];
var states:Array = ["nh", "ct", "nj" ... ];
var statenames:Array = ["New Hampshire", "Connecticut", "New Jersey" ... ];
var medincs:Array = [66303, 65958, 65173 ... ];
var hash:Object = { };
function addState(state:String, medinc:int, statename:String, hash:Object):Object
{
return hash[state] = { medinc: medinc, statename: statename };
}
for (var i:int; i < 50; i++)
{
records[i] = addState(states[i], medincs[i], statenames[i], hash);
}
すでに行った方法で行っていますが、それは必須ではありませんが、そうしていなければ、キーストロークを節約できたはずです...
ここで、検索の問題について説明します。まず第一に、検索する前に配列をソートする価値がありますが、ソートされたパラメーターの値で配列を検索する必要がある場合は、より良いアルゴリズムがありますそれ。つまり、例のデータが与えられた場合、特定のタスクは収入が 65958 である州を見つけることであり、配列が収入でソートされていることを知っていれば、二分探索を使用できます。
さて、50 ステートの例では、1 秒間に何十万回も実行しない限り、違いは目立ちませんが、一般的には、二分探索が適しています。
Wiki の記事が長すぎて読むことができない場合 ;) 二分探索の背後にある考え方は、最初に、検索された値が配列のちょうど真ん中にあると推測することです。その仮定を試し、正しいと推測した場合は、インデックスを返します。それ以外の場合 - 検索された値 (残りの配列の半分) を含む間隔を選択し、値が見つかるか同じインデックスをチェックするまでこれを行います - これは値が見つからないことを意味します)。これにより、アルゴリズムの漸近的な複雑さが O(n) から O(log n) に減少します。
ここで、目標が収入と州の間の対応を見つけることであるが、それが他の州とどのようにスケーリングするかが重要でない場合 (つまり、配列内のインデックスは重要ではありません)、別のハッシュ テーブルを持つことができます。上記の例を使用すると、収入がキーになり、状態情報オブジェクトが値になります。
function addState(state:String, medinc:int, statename:String,
hash:Object, incomeHash:Object):Object
{
return incomeHash[medinc] =
hash[state] = { medinc: medinc, statename: statename };
}
次にincomeHash[medinc]
、O(1) 時間で所得別の状態が得られます。