アトリビュートに順位をつける
アトリビュートに順位を割り振りたい場面で使うコード。
//
// アトリビュートの順位をつける
//
// Run Over:Detail
float data[];
int rank[];
for(int i = 0; i < npoints(0); i++)
{
float width = point(0, "width", i);
data[len(data)] = width;
}
// バブルソート(昇順)
for(int i = 0; i < len(data); i++)
{
for(int j = 0; j < len(data); j++)
{
if(data[i] > data[j])
rank[i] += 1;
}
}
for(int i = 0; i < npoints(0); i++)
setpointattrib(0, "rank", i, rank[i]);
pointアトリビュートのwidthに対してrankというアトリビュートを追加している。
配列を順位で返す関数
VEX内で順位が必要な場合。
以下のコードは[ 1.0, 0.51, 0.1, 0.42, 0.37 ]を入力すると[ 0, 1, 4, 2, 3 ]を返す関数。
//
// 値の配列を順位の配列で返す
//
function int[] calcRank(float array[];)
{
float value[] = array;
int order[];
for (int i = 0; i < len(array); i++)
{
order[i] = i;
}
// バブルソート(降順)
for (int i = 0; i < len(value) - 1; i++)
{
for (int j = len(value) - 1; j > i; j--)
{
if(value[j - 1] < value[j])
{
float temp = value[j-1];
value[j-1] = value[j];
value[j] = temp;
int num = order[j-1];
order[j-1] = order[j];
order[j] = num;
}
}
}
int rank[];
for(int i = 0; i < len(order); i++)
{
for(int j = 0; j < len(order); j++)
{
if(order[j] == i)
{
rank[i] = j;
break;
}
}
}
return rank;
}
使用例
float value[] = {1.0, 0.51, 0.1, 0.42, 0.37};
int rank[] = calcRank(value);
printf(sprintf('%g', rank) + '\n');
// {0, 1, 4, 2, 3}