Javascript 小工具, fCoper(按字串长短排序) By shawl.qiu
说明:
这个原来是打算命名为 fClearRepeatAndOrderByLength, 不过后来发现名字也太长了, 就换了个拼接词...
主要是, 以使用特定字符分隔的字串, 从长到短排序或从短到长排序...
并清除重复项...
算法主要就是使用 冒泡算法,,,,
先取每字串的长度, 再冒泡排序字串长度, 在排序时使用 Callback 函数进行操作...
其实还是有点复杂的...
shawl.qiu
2007-08-22
http://blog.csdn.net/btbtd
内容:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>shawl.qiu template </title>
<style type="text/css">
/* <![CDATA[ */
/* ]]> */
</style>
<script type="text/javascript">
/*<![CDATA[*/
if ( navigator. appName == "Microsoft Internet Explorer" )
{
//最大化窗口
self. moveTo ( - 5, - 5 )
self. resizeTo ( screen. availWidth + 8, screen. availHeight + 8 )
//这个脚本定义的宽度其实比原窗口还要大那么一点.
}
/*]]*/
</script>
</head>
<body>
<form id="MainForm">
<p> 输入: <br />
<textarea cols="90%" rows="5" id="InputTxa">abstract|double | goto| native |static|boolean|enum|implements|package|super|byte|export|import|private|synchronized|char|extends|int|protected|throws|class|final|interface|public|transient|const|float|long|short|volatile|abstract|double|goto|native|static|boolean|enum|implements|package|super|byte|export|import|private|synchronized|char|extends|int|protected|throws|class|final|interface|public|transient|const|float|long|short|volatile|a|b|c|d|e|f|e|f|e|f|ff|a </textarea>
</p> <p>
<input type="submit" id="Submiter" value="提交" />
<input type="reset" value="重置" />
</p>
<p>输出: <br />
<textarea cols="90%" rows="5" id="OutputTxa"> </textarea>
</p>
<p>分割符:
<input type="text" size="5" id="SplitTbx" value="|" />
|
<input type="checkbox" value="checkbox" id="SmallToLargeCbx" checked="checked" />
:从长到短
</p>
</form>
<script type="text/javascript">
/*<![CDATA[*/
var InputTxa = document. getElementById ( "InputTxa" );
var Submiter = document. getElementById ( "Submiter" );
var OutputTxa = document. getElementById ( "OutputTxa" );
var SplitTbx = document. getElementById ( "SplitTbx" );
var SmallToLargeCbx = document. getElementById ( "SmallToLargeCbx" );
Submiter. onclick =
function ( )
{
OutputTxa. value = fCoper ( InputTxa. value, SplitTbx. value, SmallToLargeCbx. checked, true );
return false;
}
function fCoper ( Source, sSplit, bSmallToLarge, bTrim )
{ // shawl.qiu code : return string
var bStr = false;
if ( Source. constructor == String ) Source = [Source ], bStr = true;
if (! sSplit ) sSplit = "|";
var StrAr = Source [ 0 ]. split ( sSplit );
StrAr = fClearArrayRepeats ( StrAr, bTrim );
fArrayOrderByLength ( StrAr );
Source [ 0 ] = StrAr. join ( sSplit );
if ( bStr ) return Source [ 0 ];
function fArrayOrderByLength ( ItemAr )
{
if ( ItemAr. length === 1 ) return ItemAr;
var Len = ItemAr. length;
var LenAr = [ ];
var i = Len;
while ( -- i > - 1 )
{
LenAr [ i ] = ItemAr [ i ]. length;
}
fSort ( LenAr, bSmallToLarge, fCallback, ItemAr );
function fCallback ( i, k, ItemAr )
{
var Temp = ItemAr [ k ];
ItemAr [ k ] = ItemAr [ i ];
ItemAr [ i ] = Temp;
}
} // end function fArrayOrderByLength(ItemAr)
function fSort ( Ar, bLargeToSmall, CallbackFunc, ItemAr, bDebug )
{ // shawl.qiu code : void return
var Debug = bDebug;
var Len = Ar. length;
var k = 0;
var Times = 1;
var bCallback = false;
if ( CallbackFunc ) if ( CallbackFunc. constructor == Function ) bCallback = true;
if ( Debug )
document. write
(
"unsorted array: "
,Ar
, "<p/>"
);
for ( var i =0; i <Len; i ++ )
{
k = i;
for ( var j = i +1; j <Len; j ++ )
{
if ( bLargeToSmall )
{
if ( Ar [ k ] < Ar [ j ] ) k = j;
}
else
{
if ( Ar [ k ] > Ar [ j ] ) k = j;
}
Times ++;
} // end for 1
if ( k != i )
{
Ar [ i ] = Ar [ i ] ^ Ar [ k ];
Ar [ k ] = Ar [ k ] ^ Ar [ i ];
Ar [ i ] = Ar [ i ] ^ Ar [ k ];
if ( bCallback ) CallbackFunc ( i, k, ItemAr );
}
} // end for
if ( Debug )
document. write
(
"sorted array: "
,Ar
, "<br/>"
, "Times: "
,Times
, "<hr/>"
);
} // end function fSort(Ar, bLargeToSmall, CallbackFunc, ItemAr, bDebug)
function fClearArrayRepeats ( ItemAr, bTrim )
{ // shawl.qiu script : return array
if ( ItemAr. length === 1 ) return ItemAr;
var Len = ItemAr. length;
var OtherAr = [ ];
OtherAr. push ( ItemAr [ 0 ] );
var OtherArLen = 1;
var i = Len;
if ( bTrim ) while ( -- i > - 1 ) ItemAr [ i ] = ItemAr [ i ]. replace ( / ^/s+|/s+$ / g, "" );
for ( var i =1; i <Len; i ++ )
{
var bSame = false;
for ( var j =0; j <OtherArLen; j ++ )
{
if ( ItemAr [ i ] == OtherAr [ j ] )
{
bSame = true;
break;
}
} // end for 2
if (! bSame ) OtherAr. push ( ItemAr [ i ] ), OtherArLen ++;
} // end for 1
return OtherAr;
} // end function fClearArrayRepeats(ItemAr, bTrim)
} // end function fCoper(Source)
/*]]*/
</script>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>shawl.qiu template </title>
<style type="text/css">
/* <![CDATA[ */
/* ]]> */
</style>
<script type="text/javascript">
/*<![CDATA[*/
if ( navigator. appName == "Microsoft Internet Explorer" )
{
//最大化窗口
self. moveTo ( - 5, - 5 )
self. resizeTo ( screen. availWidth + 8, screen. availHeight + 8 )
//这个脚本定义的宽度其实比原窗口还要大那么一点.
}
/*]]*/
</script>
</head>
<body>
<form id="MainForm">
<p> 输入: <br />
<textarea cols="90%" rows="5" id="InputTxa">abstract|double | goto| native |static|boolean|enum|implements|package|super|byte|export|import|private|synchronized|char|extends|int|protected|throws|class|final|interface|public|transient|const|float|long|short|volatile|abstract|double|goto|native|static|boolean|enum|implements|package|super|byte|export|import|private|synchronized|char|extends|int|protected|throws|class|final|interface|public|transient|const|float|long|short|volatile|a|b|c|d|e|f|e|f|e|f|ff|a </textarea>
</p> <p>
<input type="submit" id="Submiter" value="提交" />
<input type="reset" value="重置" />
</p>
<p>输出: <br />
<textarea cols="90%" rows="5" id="OutputTxa"> </textarea>
</p>
<p>分割符:
<input type="text" size="5" id="SplitTbx" value="|" />
|
<input type="checkbox" value="checkbox" id="SmallToLargeCbx" checked="checked" />
:从长到短
</p>
</form>
<script type="text/javascript">
/*<![CDATA[*/
var InputTxa = document. getElementById ( "InputTxa" );
var Submiter = document. getElementById ( "Submiter" );
var OutputTxa = document. getElementById ( "OutputTxa" );
var SplitTbx = document. getElementById ( "SplitTbx" );
var SmallToLargeCbx = document. getElementById ( "SmallToLargeCbx" );
Submiter. onclick =
function ( )
{
OutputTxa. value = fCoper ( InputTxa. value, SplitTbx. value, SmallToLargeCbx. checked, true );
return false;
}
function fCoper ( Source, sSplit, bSmallToLarge, bTrim )
{ // shawl.qiu code : return string
var bStr = false;
if ( Source. constructor == String ) Source = [Source ], bStr = true;
if (! sSplit ) sSplit = "|";
var StrAr = Source [ 0 ]. split ( sSplit );
StrAr = fClearArrayRepeats ( StrAr, bTrim );
fArrayOrderByLength ( StrAr );
Source [ 0 ] = StrAr. join ( sSplit );
if ( bStr ) return Source [ 0 ];
function fArrayOrderByLength ( ItemAr )
{
if ( ItemAr. length === 1 ) return ItemAr;
var Len = ItemAr. length;
var LenAr = [ ];
var i = Len;
while ( -- i > - 1 )
{
LenAr [ i ] = ItemAr [ i ]. length;
}
fSort ( LenAr, bSmallToLarge, fCallback, ItemAr );
function fCallback ( i, k, ItemAr )
{
var Temp = ItemAr [ k ];
ItemAr [ k ] = ItemAr [ i ];
ItemAr [ i ] = Temp;
}
} // end function fArrayOrderByLength(ItemAr)
function fSort ( Ar, bLargeToSmall, CallbackFunc, ItemAr, bDebug )
{ // shawl.qiu code : void return
var Debug = bDebug;
var Len = Ar. length;
var k = 0;
var Times = 1;
var bCallback = false;
if ( CallbackFunc ) if ( CallbackFunc. constructor == Function ) bCallback = true;
if ( Debug )
document. write
(
"unsorted array: "
,Ar
, "<p/>"
);
for ( var i =0; i <Len; i ++ )
{
k = i;
for ( var j = i +1; j <Len; j ++ )
{
if ( bLargeToSmall )
{
if ( Ar [ k ] < Ar [ j ] ) k = j;
}
else
{
if ( Ar [ k ] > Ar [ j ] ) k = j;
}
Times ++;
} // end for 1
if ( k != i )
{
Ar [ i ] = Ar [ i ] ^ Ar [ k ];
Ar [ k ] = Ar [ k ] ^ Ar [ i ];
Ar [ i ] = Ar [ i ] ^ Ar [ k ];
if ( bCallback ) CallbackFunc ( i, k, ItemAr );
}
} // end for
if ( Debug )
document. write
(
"sorted array: "
,Ar
, "<br/>"
, "Times: "
,Times
, "<hr/>"
);
} // end function fSort(Ar, bLargeToSmall, CallbackFunc, ItemAr, bDebug)
function fClearArrayRepeats ( ItemAr, bTrim )
{ // shawl.qiu script : return array
if ( ItemAr. length === 1 ) return ItemAr;
var Len = ItemAr. length;
var OtherAr = [ ];
OtherAr. push ( ItemAr [ 0 ] );
var OtherArLen = 1;
var i = Len;
if ( bTrim ) while ( -- i > - 1 ) ItemAr [ i ] = ItemAr [ i ]. replace ( / ^/s+|/s+$ / g, "" );
for ( var i =1; i <Len; i ++ )
{
var bSame = false;
for ( var j =0; j <OtherArLen; j ++ )
{
if ( ItemAr [ i ] == OtherAr [ j ] )
{
bSame = true;
break;
}
} // end for 2
if (! bSame ) OtherAr. push ( ItemAr [ i ] ), OtherArLen ++;
} // end for 1
return OtherAr;
} // end function fClearArrayRepeats(ItemAr, bTrim)
} // end function fCoper(Source)
/*]]*/
</script>
</body>
</html>