Metodos para hacer las cosas mas rapido Edito: (para Java 7)

Pues, antes disculparme, ya que he hecho muchas preguntas y no he respondido ninguna, cuando termine lo que hago me pondré en ello y ayudar para devolver el favor que ustedes me hacen al responder mis preguntas.

Verán. Estoy en ese momento de un programador en donde busco hacer las cosas mas rápido y dejar de ingeniármelas creando código que ya existe... por ejemplo no haré un método de ordenamiento de un array existiendo Arrays.sort(), (no me estoy preocupando tanto por la rapidez o eficiencia como podrán ver.)

La pregunta va ligada a esto mismo.
Me gustaria saber si existe un metodo rapido para transformar un arreglo de String a int. usualmente aria algo así:

int i = 0;
for(String s : arrStr){
arrInt[i] = Integer.parseInt(s);
i++;
}

seria genial que existiera un método en que hiciera esto en una linea, me ahorraría tiempo.

Aparte de esto también me gustaría saber si existe un método que me entregue una secuencia de números Integer entre dos Integer, no se algo como un método:

int[] arr = Math.xxx(-5,2);

donde arr sea = { -5, -4, -3, -2, -1, 0, 1, 2}

si me pueden ayudar con esto me seria de gran ayuda, nuevamente pido disculpas por ser un parásito, no durara mucho, solo una semana mas para terminar con esto.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Agregando:

Quiero agregar si me podrian explicar como limpiar el buffer del Scanner.
Como sabran si ocupa Scanner de java.util para recolectar datos y hago lo siguiete:

scanner.nextInt();
y luego
scanner.nextLine();

el nextLine no servirá, ya que hay que limpiar el Scanner, pero no tengo idea de como hacerlo, se que existe el BufferedReader y el Consolle, pero necesito usar el Scanner para la solución que estoy haciendo.

Gracias por adelantado.

Imagen de ezamudio

lambdas y streams

Si ya estás usando Java 8, convertir una lista de strings a una lista de enteros es muy fácil.

O si usas Groovy o Scala o Ceylon o cualquier otro lenguaje que no sea Java, todos traen esa facilidad ya (excepto Java antes de la 8).

En Java 8 me parece que es algo así:

 

En groovy:

 

En Ceylon:

 

En Scala creo que es  

Imagen de ezamudio

Velocidad

Me dejaste pensando con tu comentario de "hacer las cosas más rápido". Mi opinión: es más importante hacerlas bien.

A menos que la velocidad a la que tecleas sea verdaderamente lenta, escribir menos código no te va a representar un ahorro de tiempo significativo. Y en cambio, si por escribir menos código te quedan unas cosas que son difíciles de entender, ese poco tiempo que ahorraste se va a convertir en mucho tiempo que tú o alguien más va a tener que pasar leyendo el código para entender lo que hace.

Hay una vieja frase muy importante para programadores: escribe tu código como si la persona que lo va a mantener fuera un psicópata que sabe dónde vives. Ese psicópata incluso puedes ser tú en el futuro jajaj.

Na' mas dos...

 

♦ String[] → int[]

Me gustaria saber si existe un metodo rapido para transformar un arreglo de String a int [...] seria genial que existiera un método en que hiciera esto en una linea, me ahorraría tiempo

Desconozco si existe algún método en alguna librería por ahí... Sin embargo, con Java 8, puedes hacer lo siguiente:

 

 

♦ a,b → a, ..., b

me gustaría saber si existe un método que me entregue una secuencia de números Integer entre dos Integer...

Tienes suerte, mi chavo, si existe un método así, aunque tendrás que descargar la librería Apache Commons Lang 2.x

 

~~~

No me dí cuenta...

No me dí cuenta que ya existía una respuesta con Java 8. :/

Aumentando la respuesta de

Aumentando la respuesta de ezamudio, en Java 8

Stream de strings a stream de ints:
 

arreglo de Strings a arreglo de ints ( lo mismo que el anterior pero usando arreglos como entrada y salida):
 

Rango de ints como arreglo.
 

Y siguiendo sobre lo de la velocidad; no bases la velocidad en escribir menos lineas de código, sino en que tanto estás repitiendo (o peor aún haciendo copy-paste) de tu código y QUE TAN ENTENDIBLE ES ( aunque la legibilidad puede ser subjetiva, leyendo más sobre código Java puedes saber que significa legible en Java - y no solo legible para ti )

Por ejemplo tu for original para crear un arreglo es perfectamente claro y conciso, si lo estás usando más de dos veces crea una función:

 

Y llama a esta función varias veces.
 

Y está perfecto que busques una función que ya exista y que haga lo mismo, así no tienes que estar reinventando estas funciones cada vez

También googlear en inglés trae muchos más resultados.

Opino lo mismo!

ezamudio
Opino igual que tu. Veras en mi universidad me pidieron que participara en una competencia de programación, el tema es que me negué durante un mes ya que considero que una competencia que evalúa solo el tiempo y si el resultado es correcto o incorrecto esta mal hecho, faltan cosas como seguir correctamente la modularidad de la POO o que tu código coincida con las convenciones de Java entre otras cosas... pero después de un tiempo prácticamente me obligaron a participar, es por esta razón que hago preguntas como esta...
Y también pensé en lambda implementable en Java 1.8, pero me obligan usar la 1.7u40, así que no la pasare muy bien.

Gracias por tu ayuda

Imagen de ezamudio

guava

Google tiene una biblioteca llamada guava que implementa varias de estas cosas y la puedes usar en Java 7; si te dejan usar bibliotecas de terceros entonces échale un ojo puede ser una herramienta valiosa. Aunque en concursos por lo general sólo dejan usar lo más básico, que en este caso sería el puro JDK.

Y los concursos pues no son un reflejo de la realidad del desarrollo de software, pero no dejan de ser un reto interesante. Yo concursé una vez estando en la universidad. A fin de cuentas haces software desechable, que sólo sirve para ganar el concurso; si vas con esa mentalidad, te dejas de preocupar por varias cosas, pero si van a calificar el código y no solamente el software resultante, hay que cuidar que no se te vaya la mano de escribir puras porquerías que funcionen bien; mantener un diseño decente, etc pero pensando que no lo vas a tener que mantener nunca.

Lo cual me da una idea jajajaj: un concurso de programación en donde en vez de tener que hacer un programa, te dan un programa ya hecho que está todo mal escrito y medio jala y le tienes que hacer correcciones, optimizaciones y agregar un par de funcionalidades nuevas.

Los peores programas que resulten de ese concurso se pueden usar como el material de entrada para el siguiente concurso.

Gracias por su ayuda.

No me dejan usar bibliotecas
Me pedirán resolver algoritmos básicos, donde implemente la lógica... al parecer todo en la clase main, otra estupidez teniendo en cuenta que se supone que es en Java.... (Estuvo en mi lita de reclamos, porque el concurso osa tener la palabra genio en su nombre.)

Es agradable poder hablar de el tema con gente que entiende mi opinión.
Como mencione anteriormente mi universidad me obligo prácticamente a participar en una competencia. Esta competencia es entre las sedes de mi universidad a nivel nacional, el tema es que mi sede es justamente las mas nueva y pequeña... es por esto que me pidieron participar para poder representarla.

Y bueno debido a esto no conozco a nadie con quien tener este tipo de discusión, exceptuando profesores claro (algunos, otros parece que aprendieron a programar o logia POO con el clásico libro de "Aprende a programar en un dia.")

Gracias por dar sus opiniones, de verdad. Es una basura que por culpa de estar en una sede nueva y pequeña en donde la mayoría de mis compañeros estudian informática por algún tipo de obligación o porque le gustan los videojuegos y chatear (típico) no pueda tener combersaciones como esta... y con el riesgo de sonar un como un niñato emo atravesando la adolescencia... hay veces que siento que por el puro hecho de aprender y aprender mas de programación me sienta cada vez mas solo referente al tema.

Dejando los sentimentalismos... conocen alguna manera de realizar este tipo de cosas con java 1.7? (lamento no decirlo antes, me respondieron el correo hoy).

Agregando también:

Existe un método que me permita repetir una cantidad de veces un carácter o String? por ejemplo:

System.out.println(Clase.metodo("x",5)+"Hola");

Salida: xxxxxHola

Imagen de ezamudio

String.repeat

Java no tiene un String.repeat pero es muy fácil de hacer.

Hay manera de darle la vuelta a las cosas. Que todo tiene que ir dentro del main? OK... mientras no te prohiban usar clases no tienes bronca, porque puedes crear una clase Util dentro del main y poner ahí los métodos de conveniencia que necesites para el programa, como los que ya hemos discutido aquí:

 

En cuanto a poder discutir estos temas, para eso está la comunidad. Es bueno poder hablar con gente que tiene ideas similares (o muy distintas) a las tuyas, poder tener discusiones de los temas que te interesan, sin limitarte a tu área geográfica/ambiente escolar/laboral/etc.

....crea tu propia funcion y

....crea tu propia funcion y llamala varias veces.

Quizá estás mal interpretando las reglas, tienes algún link donde estén descritas? Generalmente si se evalúa el menor tiempo se refiere a tiempo de ejecución y no necesariamente a si usa una o dos lineas para hacer algo. Y si evalúa si es correcto o no el programa, pues yo no le veo ningún problema a eso, es lo fundamental.

Para repetir x veces un caracter ( o un string como en tu ejemplo) :

 

Ole, buena respuesta

Buena respuesta ezamudio (ni idea que podia hacer eso)... pero continuando con los problemas, al juzgar por lo que me han dicho, no son programas largos, son programas donde al parecer tengo que implementar logica y ya esta, son cortos de hecho. A lo que me refiero con esto a que no me servirá de mucho crear un "metodo" ya que no lo reutilizare, por lo cual solo me demorare mas. son programas simples que por ejemplo impriman el triangulo de pascal en consola de comando. (de igual manera, no sabia que se podía hacer eso, así que lo agregare a mi repertorio de cosas que puedo hacer.)

por ejemplo un tipo de pregunta (de las primeras, osea las mas fáciles) seria algo así:

Imprimir los números primos del 2 al 1000

 
(Esa solución la hice yo esperando hacerlo lo mas corto posible.)
(Me pidieron que estuvieran separados por un espacio entre medio y que el ultimo carácter fuera un espacio también, pero para quitarlo utilizaría System.out.print("\b") fuera del for)

acostumbro usar {} aunque no sea necesario.

Nada esta mal interpretado... lamentablemente

OscarRyz nop, no se refiere a ejecución... también lo pensé y pregunte, fui a una reunión en donde se podían hacer preguntas de las reglas y me encontré con semejante basura.

Basicamente son algoritmos donde hay que implementar la logica, esto se hace en una plataforma, en donde no dispongo de la posibilidad de usar distintos archivos .java o utilizar librerias externas.

Me pondrán una lista de algoritmos que se realizaran en java
Quien tenga mas preguntas bien resueltas gana, no puedo hacer pruebas ni nada. y si existen dos personas con la misma cantidad de preguntas se vera quien se demoro menos.

esto se hace durante toda la noche, desde 8PM hasta 10AM. Se hace de forma grupal, pero solo se puede utilizar una computadora para acceder a la plataforma, por lo cual los otros pareciera que están de apoyo moral.. pero bueh.
Hay alrededor de 200 grupos participando. Los ganadores son a nivel de sede y a nivel nacional.

Se usa java (Aunque las reglas parecen para un lenguaje estructurado)

¿Concurso de programación?

 

¿De casualidad el concurso está relacionado con ACM International Collegiate Programming Contest (ICPC)?

Lo cual coincide con el requerimiento de que la clase se llame Main (que contiene el método main) y adicionalmente sólo puedas usar hasta Java 7 (aunque también puedes usar C y C++).

Personalmente, siempre me ha gustado el análisis y diseño de algoritmos.

Nada especial.

Nop, es un concurso interno de una universidad de mi pais (Chile)

Si es de algoritmos

Si es de algoritmos definitivamente no se trata de la cantidad de lineas sino de la complejidad del algoritmo, por ejemplo para calcular los números primos usando fuerza bruta tendría una menor calificación que usar algún método como el "Sieve of Eratosthenes".

El no usar bibliotecas externas y fijar todo a una versión específica también me parece bastante razonable.

Suerte en tu concurso.

Imagen de ezamudio

labels?

Yo te reprobaba ese algoritmo para los primos simplemente por usar labels. Es una forma de GOTO; aunque Java soporta su uso, no es nada recomendable.

Si te toman en cuenta la velocidad de ejecución (aunque creo que ya dijiste que no), hay que buscar optimizaciones... sé que la prueba para ver si N es primo es dividirlo entre todos los números de 2 a N-1 y si en todos hubo residuo, es que es primo; pero realmente, tiene caso que dividas todos? Para ver si 101 es primo, necesitas realmente dividirlo entre todos los números de 2 a 100? No; bien puedes hacerlo sólo hasta N/2 o sea hasta 50. Y eso es para no meterte en más broncas porque bien podrías buscar su raíz cuadrada entera y hasta ahí es donde realmente vale la pena dividir (en este caso, de 2 a 10).

Y estoy de acuerdo con Oscar en que si el concurso es de resolver problemas simples, deberían considerar la calidad de las soluciones, no solamente la cantidad. Por ejemplo aunque te tardaras un poco más en implementar lo de los primos, creo que debe tener una mayor calificación el que divida solamente hasta N/2 que el que divide hasta N-1 porque su algoritmo es más rápido.

En fin. Si quieres practicar un poco, te recomiendo los ejercicios de Project Euler, suena como algo parecido a lo que les pondrán en el concurso.

Ok, Project Euler

Project Euler entonces. Gracias.
Con las criticas me doy cuenta que aun me falta mucho. Gracias.
Y si, solo evaluan tiempo que de escritura de codigo y que de la respuesta que se pide, nada mas. Ya ven porque alegue?

Imagen de rodrigo salado anaya

Error en tu código

Hola Nac-Ho, solo quería comentar acerca de tu código, el que debe pintar los números primos. Si bien tu código funciona te recomiendo mucho que tomes muy en serio los consejos que te dieron ya, puede que para el concurso en el que te estas preparando necesites algo como lo que pusiste pero no pongas algo así en producción.

Lo comento por lo difícil que me fue entender tu código, por el detalle que estas usando "labels/continue". Usar labels no se que tan bueno o malo sea, pero en lo personal y en este ejemplo en particular aumenta la dificultad de compilar y correr eso en mi cabeza.

Lo siguiente es como yo lo haría:
 

Pasala chevere y mucho éxito en tu concurso.

EDIT: Ah ya me gano Enrique la observación. : P

Tiempo límite...

 

Es de suponerse que en esos tipo de concursos, tambien debe medirse el tiempo total de ejecución, de acuerdo con la entrada.

Por ejemplo, calcular el factorial de un numero grande utilizando un algoritmo típico (el que todos conocemos) va a tardar demasiado...

Pero hay otros algoritmos más veloces que sólo unos cuántos conocen...

Por lo tanto, también debería especificarse un tiempo limite de ejecución para un problema particular, semejante a los jueces en línea (p.ej. ACM TJU Online Judge).

Imagen de rodrigo salado anaya

Algo como

Algo como el primer ejemplo de esto[ ] es como lo que menciona Enrique.

Sep

Si, esa no es mi manera de programar, ciertamente no programo con la mayor eficiencia, me falta estudio. pero de algo que estoy seguro es de que mi codigo es entendible. Lo que puse ahi es la manera mas rapida que se me ocurrio para realizar el ejercico (No en cuanto ejecucion, sino en cuanto tiempo de escritura.)

Las reglas no las hago yo, si asi fuera... uh.. si asi fuera el concurso seria muy distinto.

D:, ok no me lo puedo sacar de la cabeza.

Me podrian decir cual es la manera mas Eficiente (Esta vez si [Solo por curiosidad]) para obtener numeros primos :D?

Si se trata de verificar un

Si se trata de verificar un único número, el método tradicional es el mejor (algo similar pasa al ordenar un arreglo pequeño, con bubble-sort está bien):

 

También puedes calcular todos

También puedes calcular todos los primos que existen hasta un cierto número. Así no tendrás que ejecutar el método anterior cada vez si es que tienes una lista de números y quieres saber cuáles son primos.

 

Adicionalmente, para imprimirlos (con el espacio que mencionas):

 

Buenas.

Gracias por sus respuestas, tenia la que espero sea la ultima pregunta:
Me pidieron el uso obligatorio de Scanner para recolección de datos, mi pregunta es si hay alguna forma de pedir datos con Scanner omitiendo el salto de linea después de ingresar el dato.

Olviden mi pregunta, no tenia idea que no era necesario el enter, que con un simple espacio bastaba

Gracias!

Termino la competencia.
Solo se evaluó el tiempo en que se subían los programas terminados a la plataforma y el que funcionaran correctamente, nada mas.
fui primer lugar a nivel de sede y segundo lugar a nivel nacional. En serio agradezco su ayuda, muchas gracias.

Imagen de ezamudio

Felicidades!

Tal vez la única diferencia entre el primero y segundo lugar es que el primer lugar tecleaba más rápido jajaj.

Felicidades

Felicidades