Hola todos :
kepawe : En realidad es complicado, pero de a poco se va resolviendo.
Me pareció gracioso -no sé por qué- notar que te encontrabas con los mismos problemas que yo al avanzar con el desarrollo. En un punto empecé a sospechar que el orden alfabético en español va a ser superado por un orden alfabético 'universal'. Pero no nos adelantemos y vamos desde un principio.
Para empezar, me encapriché con usar
sort(), cuando debe haber formas de ordenar más eficientes, que no usen el código ANSI que es cualquier cosa menos alfabético. No encontré material sobre
quikSort(), pero debe tener la misma secuencia.
Por otro lado, no usé expresiones regulares a pesar de revelarse como la manera más práctica de reemplazar caracteres; porque me bajé un tutorial hace 1 mes y medio y todavía no tuve tiempo de estudiarlo.
Ésto último me recuerda que debo una aclaración. Es evidente que todos podemos aprender aún de las ideas más absurdas; pero también queda muy claro que sé poco y nada de
Arrays. Por eso dije que
caricatos fue muy generoso al dar por sentado que mis aportaciones debían estar al nivel del tema, y que mi osadía no tiene límites si pretendo que lo estén.
Aún así, dejo este código :
Código:
<HTML>
<head>
<script>
cadenas = new Array();
cadenas[0] = ["ama"];
cadenas[1] = ["maña"];
cadenas[2] = ["Año"];
cadenas[3] = ["cruz"];
cadenas[4] = ["ñandú"];
cadenas[5] = ["oca"];
cadenas[6] = ["nardo"];
cadenas[7] = ["este"];
cadenas[8] = ["éste"];
cadenas[9] = ["×ØÞß"];
cadenas[10] = ["1234"];
ascii = "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_";
ascii += "`abcdefghijklmnopqrstuvwxyz{|}~";
ascii += "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ";
ascii += "*¡¢£¤¥¦§¨©ª«¬*®¯°±²³´µ¶·¸¹º»¼½¾¿";
ascii += "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß";
ascii += "àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ";
espan = "@AÀÁÂÃÄÅÆBCÇDÐEÈÉÊËFGHIÌÍÎÏJKLMNÑ";
espan += "OÒÓÔÕÖŒPQRSŠTUÙÚÛÜVWXYÝŸZ[\\]^_`";
espan += "AÀÁÂÃÄÅÆBCÇDÐEÈÉÊËFGHIÌÍÎÏJKLMNÑ";
espan += "OÒÓÔÕÖŒPQRSŠTUÙÚÛÜVWXYÝŸZ{|}~€";
espan += "‚ƒ„…†‡ˆ‰‹Ž‘’“”•–—˜™›ž*¡¢£¤¥¦";
espan += "§¨©ª«¬*®¯°±²³´µ¶·¸¹º»¼½¾¿×ØÞß÷øþ";
var letra = "";
var letras = "";
var muestra = "";
var tempArray = new Array();
function toAscii(ary){
izq = document.getElementById("alfa");
muestra = "Array original : "+ary+"\nCantidad de elementos : "+ary.length;
izq.value += muestra; alert(muestra);
for(j=0;j<ary.length;j++){
tex = ary[j];
tex = tex.toString();
largo = tex.length;
muestra = "\nElemento "+j+" :"+tex+"\nCantidad de caracteres : "+largo;
izq.value += muestra; alert(muestra);
for(i=0;i<largo;i++){
letra = tex.charAt(i);
cod = letra.charCodeAt();
if((cod>63) && (cod<256)){
letra = letra.toUpperCase();
enEspan = espan.indexOf(letra);
enAscii = ascii.charAt(enEspan);
letras += enAscii;
}
else letras += letra;
muestra ="\nCaracter "+i+" : "+letra+"\nNueva cadena : "+letras;
izq.value += muestra; alert(muestra);
}
tempArray[j] = letras+"\t"+j;
letras = "";
}
muestra ="\n\nCadena final : \n"+tempArray.toString();
izq.value += muestra; alert(muestra);
}
function toSpanish(ary){
der = document.getElementById("bravo");
muestra = "Array original : "+ary+"\nCantidad de elementos : "+ary.length+"\n";
der.value += muestra; alert(muestra);
for(j=0;j<ary.length;j++){
tex = ary[j];
tex = tex.toString();
ind = tex.substring(tex.lastIndexOf("\t")+1);
tex = tex.substring(0,tex.lastIndexOf("\t"));
largo = tex.length;
muestra = " \n Elemento "+j+" :"+tex+"\nCantidad de caracteres : "+largo+" Index original : "+ind;
der.value += muestra; alert(muestra);
for(i=0;i<largo;i++){
letra = tex.charAt(i);
enAscii = ascii.indexOf(letra);
enEspan = espan.charAt(enAscii);
letras += enEspan;
muestra = "\r\nCaracter "+i+" : "+letra+"\r\nNueva cadena : "+letras;
der.value += muestra; alert(muestra);
}
ary[j] = cadenas[ind];
letras = "";
}
muestra = "\r\nCadena final : \r\n"+ary.toString();
der.value += muestra; alert(muestra);
}
function limpiar(){
document.getElementById("alfa").value="";
document.getElementById("bravo").value="";
}
</script>
<style>
textarea{width:100%; height:100%}
</style>
</head>
<body>
<table width=100% height=100%>
<tr height=10><td align=center>
<input type=button value="Crea elementos 'ASCIIados'" onclick="toAscii(cadenas)"> <br>
<input type=button value="Muestra el Array ordenado" onclick="alert(tempArray.sort())"> <br>
<input type=button value="Crea elementos 'Español'" onclick="toSpanish(tempArray)">
</td><td align=center>
<input type=button value="Limpia desarrollos" onclick="limpiar()"> <br>
<input type=button value="Muestra el Array original" onclick="alert(cadenas.toString())"> <br>
<input type=button value="Muestra el Array final" onclick="alert(tempArray.toString())">
</td></tr>
<tr><td width=50%><textarea id=alfa></textarea></td><td width=50%><textarea id=bravo></textarea></td></tr></table>
</body>
</HTML>
Me dió bastante trabajo lograr un demo que funcionara. Traté de no mirar mucho los ejemplos anteriores para no tentarme en seguir alguna de esa líneas y así lograr otra forma de obtener el
spanishSort(). Pero a medida que avanzaba noté que
- Cualquier ordenamiento debe seguir -justamente- un orden alfabético y no un orden arbitrario o cómodo solamente para las máquinas.
- Ese ordenamiento no tiene que ser "en español". En realidad, se puede crear una cadena que contenga -al menos- todos los caracteres latinos u occidentales (los cirílicos los dejamos para más adelante).
El problema que se aparece ahora, es más lexicológico que técnico. Hay que ubicar en su sitio caracteres como
eth ("Ð") o la doble s alemana ("ß"), que serán salteados si no se usan, pero que deben estar por si son necesarios. Un tema aparte son las vocales dobles ("æ" , "Œ"), ya que para la ordenación final deben ser reemplazadas por 2 caracteres ("ae" y "OE" respectivamente); y es allí donde se van a necesitar seguro las
regular expressions.
Supongo que con ésto ya tenemos bastante por hoy.
saludos
furoya