AYA、YAYAで配列をソートする関数です。
単純にソートするだけでなく、デリミタで区切られた特定のフィールドの内容によって
ソートすることもできます。

関数の使い方は次の通りです。

SortArray( Arrayname as String, Delimiter as String, TargetItemNumber as Integer )
  • Arraynameは、ソートしたい汎用配列の名前です。その配列そのものがソートされます。
  • Delimiterは、配列要素の中身がデリミタで区切られている場合に、デリミタを指定します。
  • TargetItemNumberは、配列要素の中身のうち、注目するフィールドの番号を0ベースで指定します。

たとえば、「単語,読み,説明…」のようなエントリが並ぶ配列を、読みで並べ替えたいときに、
デリミタに「,」、フィールド番号に「1」を指定します。

SortArray
{
	SortArrayCore( _argv[0], 0, ARRAYSIZE(EVAL(EVAL('_argv[0]')))-1, _argv[1], _argv[2] )
}

SortArrayCore
{

	_a = _argv[0] // ソートする配列の名前
	
	_first = TOINT(_argv[1])
	_last  = TOINT(_argv[2])
	_d = _argv[3]
	_n = TOINT(_argv[4])
	
	EVAL( "_x = EVAL(%('_a'))[(_first + _last)/2][ _n, _d ]" )

	_i = _first
	_j = _last

	while 1
	{
	
		while ( EVAL(" %(EVAL('_a'))[_i][ _n, _d ]" ) < _x )
		{
			_i++
		}	
		while ( _x <  EVAL(" %(EVAL('_a'))[_j][ _n, _d ]" ) )
		{
			_j--
		}
			
		if ( _i >= _j )
		{
			break
		}	
		
		EVAL("_t = %(EVAL('_a'))[_i] ")
		EVAL(" %(EVAL('_a'))[_i] = %(EVAL('_a'))[_j] ")
		EVAL(" %(EVAL('_a'))[_j] = _t ")
		_i++
		_j--
		
	}
	
	if ( _first < _i-1 )
	{
		ANCHOR.SortArrayCore( _a, _first, _i-1, _d, _n )
	}	
	if ( _j+1 < _last  )
	{
		ANCHOR.SortArrayCore( _a, _j+1, _last , _d, _n )
	}	
	
}

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-08-08 (水) 08:47:35