Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Contador de vocales

@jhosep

El objetivo consiste en separar los datos de su procesamiento, de manera que la lógica pueda reutilizarse en diversos modelos. De esa manera, el mismo método puede usarse en contextos diferentes, con igual eficacia.

Creo que se abusa demasiado de las "demos", en multitud de ejemplos que se leen por ahí, y se abunda poco en el diseño de API

septiembre 8, 2012 | Registered Commenterchoces

@chose

exacto es lo que discuto a veces con mis compañeros de la Universidad, que no es solo encontrar una solucion, si no buscar una en la que se pueda reutilizar en otros problemas y que sea eficiente. me encanto que de un problema aparentemente simple salio multitu de soluciones.

incluso hasta la podemos clasificar
-la simple utilizando un for para recorrer la cadena y un if para comparar las distintas opciones utilizando el operador OR

-utilizando Lista y el metodo constaint
-utilizando expresiones regulares
-utilizando un doble for

y lo que me gusto es que incluso el programa se puede ampliar y pedirle al usuario los caracteres que quiere contar de el texto que introducira

septiembre 8, 2012 | Registered Commenterjhosep

Me ha tentado la curiosidad de conocer cuál de todas las soluciones se ejecuta con más rapidez.

He usado un "warm up" de 1 millón de iteraciones, antes de ejecutar cada método con 100 mil iteraciones.

Los resultados son:

1º El método de doble bucle
2º El método de lista: doble de lento que el doble bucle
3º El método de Pattern: 10 veces más lento que el doble bucle

¡Enhorabuena jhosep por encontrar el más rápido! ;)

Para un uso habitual en aplicaciones reales, las diferencias no son significativas.
En mi ordenador, las 100 mil iteraciones del doble bucle "tardan" unos 35 ms

septiembre 10, 2012 | Registered Commenterchoces

XD creo que tenes razón, el doble bucle tiene una rapidez de O(m*n)
m=tamaño del string texto, y n=el tamaño del string abc
, me parece raro que el metodo de lista sea màs lento segun yo el metodo constain deberia tener un orden O(n), que al final como lo usas debería tambien ser O(m*n).
bueno gracias por el dato.

pd: bueno parece que @jose ya no aparecerá, pero por lo menos me divertí con este problema gracias @chose.

espero que todos estos post publicados ayuden a alguien XD

septiembre 11, 2012 | Registered Commenterjhosep

Sí, creo que @Jose ha perdido el aliento ;D

Aunque la lista que se usa es inmutable, siempre es más rápido recorrer un array que una lista, por lo que no me extraña mucho el resultado.
Lo repetí varias veces, con iteraciones difrentes, y el resultado es el mismo.
Las listas tienen ventajas sobre los arrays, en algunas cosas; pero en cuanto a rendimiento, no los superan.

septiembre 11, 2012 | Registered Commenterchoces

hola otra consulta tengo que elaborar una multiplicacion de dos numeros utilizando el metodo de la multiplicacion rusa pero con tecnologia applet y no tengo ni idea de como hacerlo
lo intente hacer compilandolo con el jdk en consola y tampoco lo pude hacer y ahora me lo piden con tecnologia applet les agradeceria si me ayudaran y al mismo tiempo me recomendaran un libro para entender el lenguaje de JAVA. muchas gracias


import javax.swing.JOptionPane;
public class Rusa {
public static void main (String args []){

int Multiplicando, Multiplicador;
int resultado=0;
Multiplicando = Integer.parseInt (JOptionPane.showInputDialog("Digite el Multiplicando"));
Multiplicador = Integer.parseInt (JOptionPane.showInputDialog("Digite el Multiplicador"));
While (Multiplicando > 0) {
if (Multiplicando - ( 2*( Multiplicando % 2 ) ) != 0 ){
resultado = resultado += Multiplicador;
}
Multiplicando = Multiplicando % 2;
Multiplicador = Multiplicador * 2;
}
JOptionPane.showMessageDialog(null, "Respuesta de la Multiplicacion : " + resultado);
System.out.println("Respuesta de la Multiplicacion : " + resultado);
}
}

septiembre 20, 2012 | Unregistered CommenterJose

public class Rusa {

private static int producto(final int factor1, final int factor2) {
int resultado = 0;
int factor1local = factor1;
int factor2local = factor2;
final boolean esPositivo = factor1local >= 0;
while (factor1local != 0) {
if (factor1local % 2 != 0) {
resultado += factor2local;
}
factor1local /= 2;
factor2local *= 2;
}
return esPositivo ? resultado : -resultado;
}

public static void main(String args[]) {

int resultado = producto(Integer.parseInt(JOptionPane.showInputDialog("Digite el Multiplicando")), Integer.parseInt(JOptionPane.showInputDialog("Digite el Multiplicador")));

JOptionPane.showMessageDialog(null, "Respuesta de la Multiplicacion : " + resultado);
System.out.println("Respuesta de la Multiplicacion : " + resultado);
}

septiembre 20, 2012 | Registered Commenterchoces

que informativo esta este hilo, ni en cuenta que era la multiplicacion rusa.
dejo el link por si hay otro como yo
http://tiopetrus.blogia.com/2005/042501-multiplicacion-a-la-rusa-1-.php

bueno choses se ha lucido y a dejado un buen algoritmo, pero le miro un fallo
con el soporte a negativos que solo verificas un operando y aparte no obtenes los valores absolutos de los operados para asegurar que estas trabajando con positivos

bueno hise esas modificaciones y cree mi propuesta que en esencia es lo mismo de choces


import javax.swing.JOptionPane;

/**
*
* @author L505_SP6906R
*/
public class Rusa {

public static int multRusa(int op1, int op2) {
int resultado = 0;
boolean isPositivo = (op1 >= 0 && op2 >= 0);//verificamos el signo de la multiplicacion
//volvemos los operadores positivos, ya que el metodo no sirve con numero negativos
int multop2 = Math.abs(op2);
op1 = Math.abs(op1);

do {

if (op1 % 2 != 0) {
resultado += multop2;
}
multop2 *= 2;
op1 = op1 / 2;
} while (op1 >= 1);

return (isPositivo) ? resultado : -resultado;
}

public static void main(String[] arg) {
int op1 = Integer.parseInt(JOptionPane.showInputDialog("Digite el Multiplicando"));
int op2 = Integer.parseInt(JOptionPane.showInputDialog("Digite el Multiplicador"));
int resultado = multRusa(op1, op2);
JOptionPane.showMessageDialog(null,op1 +"x"+op2+"="+ resultado);
System.out.println(op1 +"x"+op2+"="+ resultado);
}
}

pd:que me alegro que @jose aun este con vida ajja XD

septiembre 22, 2012 | Registered Commenterjhosep

@jhosep

Comprobé mi versión antes de publicarla, y creo que funciona correctamente con números negativos ;)

1. Si cualquiera de los factores es negativo, y el otro es positivo, el resultado es negativo
2. Si ambos son negativos, el resultado es positivo

septiembre 22, 2012 | Registered Commenterchoces

@chose
tenes toda la razon disculpa, debio ser el sueño cuando vi tu codigo ;),
tenes razon muy bien llevado lo del negativo, esta tan bien que a primera vista me engaño :)

,no me habia percatado de que ese algoritmo si funciona si el segundo operando es negativo y ahi fue cuando me parecio ver un error.
disculpa, y muy buen codigo :)

septiembre 22, 2012 | Registered Commenterjhosep

Creo que el nombre de esa variable boolean, esPositivo, puede inducir a error.
Quizás sería mejor denominarla así: factor1positivo

septiembre 22, 2012 | Registered Commenterchoces