Foros del Web » Programando para Internet » Javascript »

Manipular array

Estas en el tema de Manipular array en el foro de Javascript en Foros del Web. Hola de nuevo. furoya: Es importante conocer el lenguaje parar poder llevar a cabo una idea, pero sin ideas ese conocimiento es en vano. Digo ...

  #31 (permalink)  
Antiguo 20/12/2004, 18:49
 
Fecha de Ingreso: agosto-2004
Mensajes: 157
Antigüedad: 19 años, 8 meses
Puntos: 5
Hola de nuevo.

furoya: Es importante conocer el lenguaje parar poder llevar a cabo una idea, pero sin ideas ese conocimiento es en vano. Digo esto porque la idea que tuviste me parece muy buena y es lo más importante, la forma de llevarla a cabo es secundario, depende de los conocimientos del lenguaje para aprovechar mejor sus recursos, por eso aunque yo tengo unos pocos conocimientos sobre expresiones regulares y poco más de arrays, sin tu idea, el camino que hubiera escogido para desarrollar el método hubiera sido más arduo y complejo en el caso de haberlo conseguido.

En cuanto a que sabes poco o nada de arrays, viendo tu script no es tanta la diferencia entre los dos, creo que con aprender el funcionamiento de expresiones regulares y con lo que esta aprendiendo sobre arrays esta poca diferencia sera nula en poco tiempo.

No se que algoritmo utilizara sort() para ordenar los elementos pero dentro de los algoritmos para ordenar que hay, quicksort es uno de los más rápidos.
Te envío esta dirección para que veas los algoritmos más conocidos para ordenar para que te hagas una idea de como funcionan.

http://www.alumnos.unican.es/%7Euc16069/Javascript.htm

En cuanto a las preguntas que planteas, he estado indagando sobre que codificación de caracteres.
Haz esta prueba, copia el resultado de este script y pegalo en el block de notas, veras que si intentas guardarlo en codificación ANSI , te saldrá un mensaje avisando de que existe caracteres UNICODE.
<html>
<head>
<title></title>
</head>
<body>
<script language="JavaScript" type="text/javascript">
<!--

var s = "String.fromCharCode(32"
for (var Counter = 33; Counter < 400; Counter++) {
s += "," + Counter
}
s += ")"
document.write(eval(s))

//-->
</script>
</body>
</html>

Como sabes la codificación UNICODE permite representar cualquier carácter escrito en en el mundo, y los navegadores están preparados para leer cualquier idioma, si prueba el script en Mozilla y IE veras que algunos caracteres no aparecen en IE, creo que esto depende los paquetes de idiomas que tenga el navegador instalados y la configurado el usuario, creo que es suficiente con la configuración que viene por defecto para los caracteres occidentales.
No se nada de alemán , pero modificando un poco el script anterior, podrías conseguir adaptarlo al aleman.

Por ejemplo si quiseramos ordenar æ después de á bastaría con añadir unas lineas.
for(var ctr = 0; ctr < this.length ; ctr++){
temp_array[ctr] = this[ctr]
// Sustituimos las vocales acentuadas y la ñ (mininusculas)
temp_array[ctr] = temp_array[ctr].toString().replace(/á|é|í|ó|ú|ñ/g,function (str,offset,s) {
str =str=="á"?"a{":str=="é"?"e{":str=="í"?"i{":str=="ó "?"o{":str=="ú"?"u{":str=="ñ"?"n{":"n{"
return (str)
}
)
//Sustituimos las vocales acentuadas y la ñ (mayúsculas)
temp_array[ctr] = temp_array[ctr].toString().replace(/Á|É|Í|Ó|Ú|Ñ/g,function (str,offset,s) {
str =str=="Á"?"A{":str=="É"?"E{":str=="Í"?"I{":str=="Ó "?"O{":str=="Ú"?"U{":str=="Ñ"?"N{":"N{"
return (str)
}
)
// caracteres alemanes
temp_array[ctr] = temp_array[ctr].toString().replace(/æ/g,function (str,offset,s) {
str =str=="æ"?"a|":"a|"
return (str)
}
)

}

El resultado seria para á seria a{ y para æ a|, al ordenar el signo { va antes que | por lo tanto ordinaria primero la a acentuada.

Espero haberme explicado bien, no es mi fuerte. Corrigeme si me equivoco en algo.

Saludos
  #32 (permalink)  
Antiguo 26/12/2004, 12:53
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 6 meses
Puntos: 317
El tema de las vocales se me complica un poco; pero no tiene que ver con el código sino con la lógica de los diccionarios, que toman a las vocales acentuadas como vocales simplemente, hasta que aparecen 2 palabras iguales y entonces sí valen los acentos.

Con respecto a las vocales dobles ... el método funciona bien, pero casi las cambiaría por su versión "separada" ( æ por AE) y no admitiría discusiones para otros idiomas.

El algoritmo que usa sort en el ejemplo para ordenar números que posteaste más arriba funciona muy parecido a quickSort; estuve poniendo alertas para seguir el mecanismo. La página que recomiendas me demuestra que esa costumbre no es de mi exclusiva propiedad. La forma en que muestra el desarrollo se termina pareciendo a la de mi código anterior.

Todavía no me animo a corregir 'códigos'; pero seguí investigando sobre ordenamiento alfabético mientras le daba una vuelta de tuerca más al método de cadena reordenada.

Un aparte : es, al menos, interesante que preguntes si hay algo para corregir. No sé si es un tema personal o cultural -aquí se reúne gente de distintas ciudades, formación, edad- pero más de uno considera ofensivo el corregir un mensaje ajeno. A mi me costó entenderlo, porque la idea de un foro es proponer algo publicamente para luego mejorarlo, ampliarlo, re-utilizarlo; y las correcciones, en más de una ocasión, son inevitables. Ésto debe ser más fácil de entender para quien tiene educación científica -se me ocurre-.
También pienso que caricatos ya tiene experiencia en esto de crear códigos en conjunto y es una suerte que se haya interesado en el tema, pero ...
Caricatos : vi que pusiste mi nombre en la página de los Arrays y me dio un poco de vergüenza. Al pricipio creí que era provisorio, ahora sospecho que se va a quedar ahí. Gracias, lo único que vas a conseguir es hacerme famoso.
Volvamos al asunto del alfabeto. Busqué en internet y no hallé listas de caractees ordenados para cada idioma, pero supe que la misma letra puede estar ubicada en distintos sitios dependiendo de qué lengua la utilice.
El segundo paso fue pedir a amigos y conocidos que me dieran los abecedarios que conocían, y me hice solamente del francés, alemán, danés.
Cuando me descubrí caminando hacia la compañía de teléfonos para pedir una guía de cada país del mundo, sospeché que estaba encarando mal el problema.

Si bien un ordenamiento final de letras va a ser, de alguna forma, arbitrario; el ordenamiento de signos y símbolos ( que no suelen estar en diccionarios ni en las páginas amarillas ) puede ser caótico. Elegí un orden, solamente para seguir trabajando, con la certeza de que no será definitivo.

La última versión del método de ordenar por cadenas está en pausa. No me parece que sea páctica y por eso no la posteo. Pero sí la puedo explicar.

Quise ahorrarme uno de los dos strings ( recordemos que del primero obtenía una posición de caracter y el segundo me daba un caracter de reemplazo que serviría para que sort lo ordenase según ASCII ), y decidí aprovechar que cada caracter tiene su número, para convertir todas las palabras a números y luego, sí, pasarlos por sort o quickSort . Pero el ahorro, comparado con la cantidad de código que debo agregar, es mínimo.

Un ejemplo : si quisieramos ordenar AMA, BOJ, CASA, UNA (A=1...Z=26) nos quedaría

Código:
AMA   1131   ó   AMA   011301
UNA  20141       BOJ   021510
BOJ  21510       CASA  03011901
CASA 31191       UNA   201401
La segunda muestra es sin dudas la que funciona. Pero se nota que hay que rellenar con ceros hasta la cantidad de dígitos del 'caracter' más largo. En los ejemplos, todos los caracteres son de '2 dígitos', pero si tenemos en cuenta que en UNICODE hay decenas de miles de caracteres; o llevamos cada letra al máximo posible ( A = 00001 ), con lo que "SALAMANDRA" se convierte en una cadena de 50 caracteres; o buscamos en cada Array el caracter de número más alto y le damos el mismo length a todos los demás caracteres.

Ésto último parece más eficiente, pero requiere más cálculo y más líneas de código aún. Por eso lo abandoné.

Dejo el orden con el que estoy trabajando. Si algún lingúista puede sugerir algún cambio, a mí no me ofende y será bienvenido.

Código:

alterAscii = "  ¡!¿?\"'‘’“”‹›«»#$¢£¤¥€‰%ƒ&\{}"
alterAscii +="[]()<>*+-±×÷=†‡‚„…:;,./|\\¦@°`´˜"
alterAscii +="ˆ¨¸^¬*¯_–—~¼½¾¹²³ªº©®™§µ¶·•01234"
alterAscii +="56789AÀÁÂÃÄÅÆBCÇDÐEÈÉÊËFGHIÌÍÎÏJ"
alterAscii +="KLMNÑOÒÓÔÕÖØŒPQRSŠTUÙÚÛÜVWXYÝŸZÞ"
alterAscii +="ߎŽ"
 
saludos

furoya
  #33 (permalink)  
Antiguo 27/12/2004, 17:22
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Hola a todos:

furoya: Lo de poner créditos creo que tan solo es lo justo, aunque cuando alguien usa código mio, simplemente me conformo con el agradecimiento. La página, no la toco desde hace tiempo por falta del "ídem" ... Además, mi propia página la tengo un poco descuidada.

El tema me sigue interesando, y en cuando esté más desahogado seguiré adelante.

Sobre el tema de la ordenación, me parece que se están complicando más de lo necesario. Creo que cuando no se trata de palabras normales la ordenación tendría que ser ascii.
Otra cosa que he visto es que se ordena primero unos signos y luego las letras, pero no sería más lógico anteponer tan solo los signos abiertos y dejar los cerrados después de las letras ¿ ?
En español los signos cerrados se ponen después de las palabras (incluso en inglés ni se abren).

Saludos y Felicidades

P.D: furoya, ¿has vuelto a intentar enviar postales?
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #34 (permalink)  
Antiguo 29/12/2004, 03:50
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Hola otra vez:

A partir de otra pregunta, hemos preparado otros métodos.
La pregunta: http://www.forosdelweb.com/f13/array-257337/

Y las respuestas ya la he puesto en Array.js...
También modifiqué buscar para que devuelva el primer objeto igual y el último:
Los scripts con objetos serían:

Código:
Array.prototype.buscarPrimerObjeto = function(objeto, dato)	{
	var yo = this;
	for (var i = 0, mayor = yo.length; i < mayor; i ++)
		if (yo[i][objeto] == dato) return i;
	return -1;
}

Array.prototype.buscarUltimoObjeto = function(objeto, dato)	{
	var yo = this;
	for (var i = yo.length - 1; i >= 0; i --)
		if (yo[i][objeto] == dato) return i;
	return -1;
}
Creo que pueden ser útiles para acotar arrays dentro de determinados rangos.
Tal vez una buena posibilidad es buscar el primero mayor o igual y el último menor o igual, para evitar el índice -1.

En la página que propuse antes ya implementé una búsqueda: http://www.pepemolina.com/arrays/index.html

Saludos y Felicidades
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #35 (permalink)  
Antiguo 30/12/2004, 13:42
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 6 meses
Puntos: 317
Hola todos :

kepawe : estoy a punto de empezar a estudiar mejor tus códigos. Mis métodos me llevan siempre a callejones sin salida, y cuando encuentro un resquicio aparece otra "regla" de ordenación alfabética y tengo que rehacer todo otra vez. Es éso, o abandono hasta después de las vacaciones para poder pensar más claramente.

caricatos : El problema del ASCII es que no es orden alfabético, por eso no sirve. De "casualidad" coinciden las letras en inglés si son todas mayúsculas ( o minúsculas ) por eso para ordenar se usa el truco de toUpperCase(); pero lo de los signos de apertura y cierre es algo atendíble.

saludos y buen año para todos.

furoya

P.D. : ya probé lo de las tarjetas, te mando un MP con los detalles.Gracias.
  #36 (permalink)  
Antiguo 01/04/2005, 15:35
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 1 mes
Puntos: 2
Acerca de los Arrays ???



Una pregunta, he visto que estan batallando mucho con el orden de los arreglos, en este momento yo tengo el mismo problema deseo usar el .sort de javascript, porque esta compromado que es hasta 200 veces mas rapido que cualquier otro script programado por uno mismo, y bien, yo tengo esta idea, y quiero saber si ustedes que ya han visto este tema tantas veces, ya lo habian pensado, y si asi fue, si encontraron muchos problemas y por eso no la implementaron.

1. Crear una funcion que convierte todos los valores en el arreglo a su equivalente a un numero especifico.

function arrArrayChangeValues(arrVar, intType)
{
arrCars = "A, B, C, D, E, F ...... "
arrCarsIntegers = "1,2,3,4,5,6,7,7,9,10......"

if (intType = 1)
{
//Decimos que hemos recibido un arreglo alfanumerico que debemos
//cambiar por sus valores en INTEGER
}
else
{
//Decimos que hemos recibido un arreglo numerico que debemos
//cambiar por sus valores en ALFANUMERICOS
}
}

2. Tenemos nuestro arreglo alfanumerico, entonces, llamamos a la funcion (1), para convertirlo a valores numericos.

arrIntegerValues = arrArrayChangeValues(arrVarOriginal,1)

3. Aplicamos la funcion de JS para el sort numerico.

arrIntegerValues.sort(function(a,b){return a-b;})

4. Tenemos nuestro arreglo numerico correctamente ordenado, entonces, llamamos a la funcion (1), para convertirlo a valores alfanumericos.

arrVarOriginal= arrArrayChangeValues(arrIntegerValues,2)

5. Y listo tenemos el arreglo correctamente ordenados...

Observaciones....

1. Porque estamos seguros que esta correctamente ordenado?
R = Porque nosotros hemos asigando los valores numericos exactos que necesitamos.

2. Este es un algoritmo que cubre todos los casos, logicametne falta solo validar algunos casos y completar el codigo, pero me parece el mejor metodo para hacerlo..

Bueno, entonces por favor si alguien ya lo intento esto, digame que problemas encontro, porque lo veo como lo mas facil de lograr, de hecho los valores numericos pueden ser creados tambien con alguna funcion que se encargue de decir cosas como, "abc" > "y", pensando en unidades, decenas, centenas, etc.

Bien son muchos casos que validar lo se, pero el metodo no lo vi en ninguno de sus comentarios, por eso lo pregunto, y si de algo les sirve, les dejo la idea para que la puedan revisar... por favor cualquier cosa contestenme, mi e-mail es [email protected]

Necesito estar seguro de este metodo porque quiero cambiar mi actual metodo personal de SORT (Burbuja) a usar el SORT de JavaScript, porque bueno, les dejo el dato, esta comprobado que cualquier metodo programado por ti mismo, resulta 200 veces mas lento que el SORT basico que hace jsvascript.

Entonces esa es la verdadera utilidad de todo esto.

Gracias.

Atte.

Neuron_376
  #37 (permalink)  
Antiguo 02/04/2005, 17:27
(Desactivado)
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ciudad Autónoma de Buenos Aires
Mensajes: 2.367
Antigüedad: 21 años, 6 meses
Puntos: 317
Hola Neuron_376 :

la última idea era un orden alfabético. No sé si es lo que buscas, o simplemente ordenar caracteres según una secuencia que tu armas. puedes ver algo así en este mismo tema (p.e. en el mensaje #32). Allí no es necesario hacer un array de números, se usa uno de caracteres reordenados y se lee la ubicación (así se obtiene el número). También se puede usar su código unicode, en cuyo caso en orden será tipo ASCII.

No es necesario poner tu e-mail, te podemos (debemos) responder aquí.

saludos

furoya
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:22.