Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > reducir codigo

public class Operación{
public int sumar(int a, int b){return a+b;}
public int sumar(int a, int b, int c){return a+b+c;}
public int sumar(int a, int b, int c, int d){return a+b+c+d;}
}

Con las versiones más recientes de java ¿cuál es la mejor estrategia para reducir el código anterior?

mayo 27, 2014 | Registered Commenterkarelpuerto78

public class Operacion {

public int sumar(Integer... valores) {
return sumar(Arrays.asList(valores));
}

public int sumar(List<Integer> valores) {
int suma = 0;
suma = valores.stream().map((Integer item) -> item).reduce(suma, Integer::sum);
return suma;
}

public int sumar(int... valores) {
int suma = 0;
for (int item : valores) {
suma += item;
}
return suma;
}
}

mayo 27, 2014 | Registered Commenterchoces

Sigue un test que comprueba los métodos de Operacion, y que muestra su flexibilidad.

public class OperacionTest {

/**
@param args the command line arguments
*/
public static void main(String[] args) {

Operacion operacion = new Operacion();

int suma1 = operacion.sumar(new Integer[]{1, 2, 3, 4, 5});

int suma2 = operacion.sumar(Arrays.asList(1, 2, 3, 4, 5, 6, 7));

List<Integer> valores = new ArrayList<>(10);
for (int i = 1; i <= 10; i++) {
valores.add(i);
}
int suma3 = operacion.sumar(valores);

int suma4 = operacion.sumar(1, 2, 3, 4, 5, 6, 7, 8, 9);

int suma5 = operacion.sumar(new int[]{1, 2, 3});

System.out.println("suma1= " + suma1);
System.out.println("suma2= " + suma2);
System.out.println("suma3= " + suma3);
System.out.println("suma4= " + suma4);
System.out.println("suma5= " + suma5);
}

}

mayo 28, 2014 | Registered Commenterchoces

Puesto que las operaciones con enteros pueden provocar resultados erróneos, debido al overflow por encima, o por debajo, de los valores Integer.MAX_VALUE o Integer.MIN_VALUE, siguen la clase rectificada y un nuevo test.

mayo 28, 2014 | Registered Commenterchoces

public class Operacion {

public BigInteger sumar(BigInteger... valores) {
return sumar(Arrays.asList(valores));
}

public BigInteger sumar(List<BigInteger> valores) {
BigInteger suma = BigInteger.ZERO;
for (BigInteger item : valores) {
suma = suma.add(item);
}
return suma;
}
}

mayo 28, 2014 | Registered Commenterchoces

public class OperacionTest {

/**
@param args the command line arguments
*/
public static void main(String[] args) {

Operacion operacion = new Operacion();

BigInteger suma1 = operacion.sumar(new BigInteger[]{BigInteger.valueOf(1), BigInteger.valueOf(2), BigInteger.valueOf(3), BigInteger.valueOf(4), BigInteger.valueOf(5)});

BigInteger suma2 = operacion.sumar(Arrays.asList(BigInteger.valueOf(1), BigInteger.valueOf(2), BigInteger.valueOf(3), BigInteger.valueOf(Integer.MAX_VALUE)));

List<BigInteger> valores = new ArrayList<>(10);
for (int i = 1; i <= 100; i++) {
valores.add(BigInteger.valueOf(i));
}
BigInteger suma3 = operacion.sumar(valores);

System.out.println("suma1= " + suma1);
System.out.println("suma2= " + suma2);
System.out.println("suma3= " + suma3);

}
}

mayo 28, 2014 | Registered Commenterchoces

ninguna de las respuestas anteriores son correctas, porque ninguna reduce el codigo.

junio 25, 2014 | Unregistered Commenteryurs

Todas son correctas y todas reducen el código.

Tal y como se ha planteado, esa clase solo permite sumar 2, 3 o 4 números, nada más, y con métodos diferentes. Si se desean sumar más números, es inevitable añadir más métodos, con diferentes signaturas.

Cada solución planteada permite sumar cualquier secuencia de números indeterminada, con un único método.

"Reducir código" no consiste solamente en "contar menos líneas", aún menos cuando se empaqueta el código en una única línea, al margen de cualquier recomendación de legibilidad, con el objeto de contar menos.

La clase planteada, como API, con tres métodos sobrecargados que hacen lo mismo, y que se limita a tres operaciones, es un ejemplo de redundancia y limitación inaceptables.

junio 25, 2014 | Registered Commenterchoces

Por si no queda claro, sigue la clase propuesta debidamente formateada.

public class Operacion {

public int sumar(int a, int b) {
return a + b;
}

public int sumar(int a, int b, int c) {
return a + b + c;
}

public int sumar(int a, int b, int c, int d) {
return a + b + c + d;
}
}

Esta es la reducción propuesta, usando JavaSE 1.8

public class Operacion {

public int sumar(int... valores) {
int suma = 0;
suma = Arrays.stream(valores).reduce(suma, Integer::sum);
return suma;
}
}

Y esta otra, usando versiones anteriores

public class Operacion {

public int sumar(int... valores) {
int suma = 0;
for (int item : valores) {
suma += item;
}
return suma;
}
}

junio 25, 2014 | Registered Commenterchoces

ninguna de las respuestas anteriores son correctas, porque ninguna reduce el codigo.

Que gracioso!

junio 25, 2014 | Unregistered CommenterUnoPorAhi

Hay algunas otras cosas "graciosas" sobre este asunto.
En esta misma página hay otra entrada reciente, con exactamente la misma cuestión: una "fotocopia" perfecta.
En ningún caso, los autores de las entradas se han dignado hacer ningún comentario, ni explicar tal curiosa "coincidencia".
Y ahora, aparece un comentario, a una entrada de hace un mes, que se limita a descalificar las respuestas.

junio 25, 2014 | Registered Commenterchoces

No te molestes choces.

Lo que comentas es habitual. Hace tiempo publique un blog con temas de bastante alto nivel y la mayor parte de comentarios que recibi es que mi blog era inutil porque los retrasados no lo pillaban o porque las soluciones eran a problemas que no eran los del usuario, perfectamente claro porque tenemos la obligación ineludible de solventarle los problemas a los novatos.

Jode, y jode mucho, que te esfuerces en mirar algo y no solo no te lo agradezcan sino que te echan en cara que lo que has dicho no encaja con lo que su "profe" ha decidido.

Solo como un comentario sobre el tema:
Me apunte a la UOC y el la asignatura de TAD's (Estructura de la iformacion creo que se llamaba) me toco un profesor (necesita parentesis. Ni puta idea, ignorante de arriba a abajo) que me solicito como práctica un arbol AVL.

El arbol se realizó perfectamente, su eficacia era muy alta pero fui suspendido porque no use las patéticas clases que genero el "profesor" sino las mias.

Lo siento, pero considero al 90% de los "profes" de informatica como unos ignorantes supinos, indignos de tocar un teclado. Parece que hoy día saber informatica no es imprescindible para actuar de profesor de informática.

Si eres filologo latino, filosofo oriental o teologo con master en creencias musulmanas basta para que puedas dar clases de informática. Para ser exactos en mi empresa, HP, vale mucho mas tener un titulo aunque sea de historia del arte que saber algo de informática. Tengo un jefe que no tiene ni puta idea pero como es físico y le ha dedicado unas 40h a la informatica sabe mas que cualquiera que sin titulo universitario le ha dedicado entre 5000 y 50000 horas al tema.

Id comprando productos HP. Yo aunque tengo descuentos, jamas me compraría nada que llevara este logotipo. Se lo que hay.

Pienso que los actuales profes de informática, totalmente alienos a lo que el mundo empresarial pide, son genios que tienen todo el derecho del mundo a decir que dos mas dos son cinco porque el algoritmo que usamos los demas es erroneo.

Bueno, fiesta para todos
Ramon

junio 25, 2014 | Unregistered CommenterPaposo