2007/09/27(Thu) 12:23:38 編集(投稿者)
> string[] putChar = new string[count];
Char[n].toString() を ArrayList に格納して、取得したアイテムは
リムーブすればいけるのでは?
ArrayList = { "A","B","C" }
n = random.next(ArrayList.Count)
putChar[count++] = ArrayList.Item(n)
ArrayList.Items.remove(n)
を ArrayList.Count = 0 まで繰り返す。
上はイメージなんで、適当です。
上記イメージのサンプル:
コピペして *.html で保存。ブラウザで実行すれば結果が出てきます。
とりあえず、要件は満たしていると思うので、
これを C# に直せばOK。
<!--
C# 移植にあたり
arr, Arr 等が名前に含まれる変数は全て ArrayList に置き換える
map 変数は、Dictionary に置き換える
removeItem() に該当するのは、ArrayList#remove たぶん。調べて。
Math.random() に相当するのは、Random クラス
C# で言うと、
randText() がクラスで、removeItem,initialize,randomizer が
private メソッド、randomArray が readonly プロパティで、
showResult が public なメソッドです。
C# なら、class randText、コンストラクタに文字列取って、
initialize, randomizer 呼び出ししてから、randomArray を初期化。
てな感じでしょか。
for in 構文が無いなら、Iterator 取ってぐるぐる回して下さい。
-->
<script>
<!--
function randText(text) {
this.srcText = text;
function removeItem(arr, index) {
var newArr = new Array();
for (var i=0;i < arr.length;i++) {
if (i != index) newArr.push( arr[i] );
}
return newArr;
}
//初期化
function initialize(text) {
var map = new Array();
//同じ文字をカウント(1つに纏める)
for (var i=0;i < text.length;i++) {
var element = text.charAt(i);
if (!map[element])
map[element] = 0;
map[element] += 1;
}
//配列を作成
var retArr = new Array();
for (var key in map) {
retArr.push( key );
}
// alert("initialize:: " + retArr);
return retArr;
}
//ランダムで並べ替え
function randomizer(arr) {
var retArr = new Array();
try {
while (arr.length > 0) {
var rand = parseInt(Math.random() * arr.length);
retArr.push( arr[rand] );
arr = removeItem(arr, rand);
// alert("removed::" + arr);
}
}
catch (e) {
alert(e.message);
}
// alert("randomizer:: " + retArr);
return retArr;
}
this.randomArray = randomizer( initialize(text) );
this.showResult = function() {
alert( "Result:: " + this.srcText + " => " + this.randomArray );
}
}
var obj = new randText("ABCFWCBADEFG");
obj.showResult();
//-->
</script>