0

私はプロジェクトに取り組んでいますが、Stack Overflowはこれまでにいくつかの問題を解決してくれたので、とても感謝しています。

私の質問はこれです:

私はこのような配列を持っています:

var records:Object = {};

var arr:Array = [
records["nh"] = { medinc:66303, statename:"New Hampshire"},
records["ct"] = { medinc:65958, statename:"Connecticut"},
records["nj"] = { medinc:65173, statename:"New Jersey"},
records["md"] = { medinc:64596, statename:"Maryland"},

など...50州すべて。そして、次のように配列を数値的に逆に(降順で)ソートします。

arr.sortOn("medinc", Array.NUMERIC);
arr.reverse();

レコードの名前(つまり、ニュージャージーの場合は「nj」)を呼び出してから、配列内のレコードの上下の数値位置から値を取得できますか?

基本的に、medincは米国の州の中所得であり、ランキングシステムを表示しようとしています...たとえば、ユーザーがテキサスをクリックすると、テキサスのmedinc値が表示され、州が1つ下の位置にランク付けされます。配列内で1つ上の位置にランク付けされている状態。

ご協力いただきありがとうございます!

4

4 に答える 4

3

オブジェクトがわかっている場合は、array.indexOf() を使用できます。

var index:int = records.indexOf(records["nj"]);

var above:Object;
var below:Object;

if(index + 1 < records.length){ //make sure your not already at the top
   above = records[index+1];
}

if(index > 0){  //make sure your not already at the bottom
   below = records[index-1];
}
于 2012-08-29T23:58:06.157 に答える
0

これがあなたのデータの私の理解に基づく答えだと思います。

var index:int = arr.indexOf(records["nh"]);

これにより、クリックされたレコードのインデックスが取得され、その下と上のレコードが検索されます。

var clickedRecord:Object = arr[index]
var higherRecord:Object = arr[index++]
var lowerRecord:Object = arr[index--]

それがあなたの質問に答えることを願っています

于 2012-08-30T00:03:35.190 に答える
0

本当にレコードをハッシュする必要がありますか?

そうでない場合は、キーをレコード フィールドに移動し、レコードを単純な配列に変更します。

var records: Array = new Array();
records.push({ short: "nh", medinc:66303, statename:"New Hampshire"}),
records.push({ short: "ct", medinc:65958, statename:"Connecticut"}),
....

これにより、State のクラスを作成し、Array を Vector に変更し、このすべてをタイプ セーフにすることができます。これは常に良いことです。

これらのキーが本当に必要な場合は、現在行っているのと同じ方法で (「短い」フィールドを使用して) 上記のようなオブジェクトを追加できます (おそらく、addState(records, data ) { records[data.short] = data })。

最後に、これらのレコードを 2 つのオブジェクト (またはオブジェクトと配列など、必要なもの) に保持することもできます。状態オブジェクトを一度作成し、参照を配列/オブジェクト/ベクトルに保持する場合、これは高価ではありません。状態を異なるキーで頻繁にソートする必要がある場合は、良い考えです。

于 2012-08-30T02:04:23.323 に答える
0

これは、データを設定するための実際には良い方法ではありません。入力が多すぎます (「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) 時間で所得別の状態が得られます。

于 2012-08-30T09:37:30.463 に答える