ホーム > タグ > Array

Array

配列から重複せずに値を取り出す

最近クイズを作る機会が何度かありまして、総数20問から7問を重複しないよう抜き出して順番に表示していくというようなことをしました。その時に作ったクラスです。

配列から重複せずにn個取り出して新しい配列を返すRandomExtractクラス

Action Script
package
{
	public class RandomExtract
	{
		/**
		 * コンストラクタ
		 *
		 * @access public
		 * @param
		 * @return void
		 */
		public function RandomExtract():void
		{
		}

		/**
		 * ランダムに配列の値を取り出す
		 *
		 * @access public
		 * @param array 元になる配列
		 * @param num 取り出す配列の個数
		 * @return Array
		 */
		public static function random(array, num):Array
		{
			var a:Array = array;
			var t:Object = {};
			var r:Array = [];
			var l:int = a.length;
			var n:int = num < l ? num : l;
			while (n-- > 0) {
				//配列の数からランダムな値を作成
				var i = Math.random() * l | 0;
				r[n] = t[i] || a[i];
				//  t[i]がundefinedにならない処理
				--l;
				t[i] = t[l] || a[l];
			}
			return r;
		}
	}
}

例えば10個の配列から3個の値を取り出したい時は以下のように記述します。

Action Script
import RandomExtract;

var arr:Array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
var num:int = 3;

var newArr:Array = RandomExtract.random(_arr, _num);
trace(newArr + "が取り出されるんだぜ");

出力結果はこんな感じです。

Action Script
2,1,6が取り出されるんだぜ

参考サイトがあってそこのコードを自分に分かりやすいように書き換えただけなのですが、どこだったか分からなくなってしまいました。見つけたら追記します。

[9/21 追記]
ムダにRandomExtractクラスをインスタンス化していたのでrandomメソッドをstaticに修正。

1つの配列から1つずつずれた2次元配列を作る

1つの配列から要素を1つずつずらした多次元配列の作り方。

Action Script
var _array:Array = [1, 2, 3, 4];
var _allArray:Array = new Array();
var _length:int = _array.length;

for (var i:int = 0; i < _length; i++ ) {
	var a:Array = new Array();
	_allArray[i] = a;
	for (var j:int = 0; j < _length; j++ ) {
		a[j] = _array[j];
	};
	if (i != 0) {
		for (var k:int = 0; k < i; k++ ) {
			var n:Number = _allArray[i].pop();
			_allArray[i].unshift(n);
		}
	}
}

出力結果は以下のようになります(見難いので改行してます)。

Action Script
1,2,3,4,
4,1,2,3,
3,4,1,2,
2,3,4,1

配列を1つずつ2次元配列に追加して、pop()で配列の末尾を削除、unshift()で先頭に追加。1個目はそのまま、2個目だったら1回、3個目だったら2回削除&追加を繰り返す。
出現の順番を変えたい時とかに使えると想ったんだけど、もっといいやり方がありそう。そもそもこんなことやる意味ないかも。

Home > Tags > Array

Search
Feeds
Meta
works
MYUNGMI'S PARK+
友人のイラストレーターのポートフォリオサイトです。ゴキゲンなイラストがいっぱい!
AnotherBookmark
1日1カワイ子ちゃん
やっぱダッフルでしょ

Return to page top