Ejemplos de Código Java para Tareas Comunes
Método para Invertir una Cadena en Java
Este método toma una cadena de texto y devuelve una nueva cadena con los caracteres en orden inverso.
public String invertirCadena(String s) {
String resultado = "";
if (s == null) {
return null; // O manejar como se prefiera
}
for (int i = s.length() - 1; i >= 0; i--) {
resultado = resultado + s.charAt(i);
}
return resultado;
}
Método para Invertir un Array en Java
Este método invierte los elementos de un array de cadenas in situ (modifica el array original).
public void invertirArray(String[] a) {
if (a == null) {
return; // No se puede invertir un array nulo
}
String auxiliar;
for (int i = 0; i < a.length / 2; i++) {
auxiliar = a[i];
a[i] = a[a.length - 1 - i];
a[a.length - 1 - i] = auxiliar;
}
}
Combinar Sets de Enteros Positivos en Java
Este método recibe dos conjuntos (Sets) de enteros y devuelve una lista con los enteros que están presentes en ambos conjuntos y son mayores que cero.
import java.util.*;
public class Ejercicio01A {
public List<Integer> enterosEnAmbos(Set<Integer> s1, Set<Integer> s2) {
List<Integer> resultado = new ArrayList<>();
if (s1 == null || s2 == null) {
return null; // O devolver lista vacía: return new ArrayList<>();
}
for (Integer i : s1) {
if (i != null && i > 0 && s2.contains(i)) {
resultado.add(i);
}
}
// Opcionalmente, ordenar el resultado
// Collections.sort(resultado);
return resultado;
}
}
Calcular Importe Total desde Arrays en Java
Este método calcula un importe total basado en arrays paralelos de materiales y cantidades. Asume que existe una clase Material
con un método getPrecio()
.
import java.util.*;
// Asumiendo que existe una clase Material como esta:
/*
class Material {
private double precio;
// constructor, otros campos...
public double getPrecio() {
return precio;
}
}
*/
public class Ejercicio01B {
public double calcularImporte(Material[] materiales, int[] cantidades) {
double resultado = 0;
if (materiales == null || cantidades == null) {
return -1; // Error: arrays nulos
}
if (materiales.length != cantidades.length) {
return -2; // Error: arrays de diferente longitud
}
for (int i = 0; i < materiales.length; i++) {
if (materiales[i] != null) { // Comprobar si el material no es nulo
resultado += materiales[i].getPrecio() * cantidades[i];
} else {
// Decidir cómo manejar materiales nulos (¿ignorar? ¿error?)
// return -3; // Ejemplo: Error si hay material nulo
}
}
return resultado;
}
}
Uso de GregorianCalendar en Java
Este ejemplo lee una fecha del usuario, la representa con GregorianCalendar
y luego muestra las tres fechas siguientes, incrementando de 10 en 10 días.
import java.io.*;
import java.util.*;
public class Ejercicio01C {
public void run() throws Exception {
final String[] nombreMes = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"};
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int dia, mes, anno;
String entrada;
GregorianCalendar fecha = null;
System.out.print("Dame una fecha [dd/mm/aaaa]: ");
entrada = in.readLine();
try {
// Opción 1: Usando Scanner
/*
Scanner sc = new Scanner(entrada).useDelimiter("/");
dia = sc.nextInt();
mes = sc.nextInt();
anno = sc.nextInt();
sc.close();
*/
// Opción 2: Usando split (más robusto si hay espacios)
String[] partes = entrada.split("/");
if (partes.length == 3) {
dia = Integer.parseInt(partes[0].trim());
mes = Integer.parseInt(partes[1].trim()); // Mes es 1-based aquí
anno = Integer.parseInt(partes[2].trim());
// GregorianCalendar usa mes 0-based (0=Enero, 1=Febrero...)
fecha = new GregorianCalendar(anno, mes - 1, dia);
} else {
System.out.println("Formato de fecha incorrecto.");
return;
}
} catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
System.out.println("Error al parsear la fecha: " + e.getMessage());
return;
}
System.out.println("Fechas incrementadas en 10 días:");
for (int i = 1; i <= 3; i++) {
fecha.add(Calendar.DATE, 10);
System.out.format("%d de %s de %d%n",
fecha.get(Calendar.DATE),
nombreMes[fecha.get(Calendar.MONTH)],
fecha.get(Calendar.YEAR));
}
}
// Para poder ejecutarlo
public static void main(String[] args) throws Exception {
new Ejercicio01C().run();
}
}
Ejemplo de Encapsulamiento con Sprites en Java
Una clase simple Sprite
que demuestra encapsulamiento con coordenadas (x, y) y un límite estático (maxX).
public class Sprite {
private double x, y;
private static double maxX = 500; // Valor inicial por defecto
// Bloque estático opcional para inicializar maxX si es necesario
// static {
// maxX = 500;
// }
public Sprite() {
this.x = 0;
this.y = 0;
}
public Sprite(double x, double y) {
// Se podría añadir validación aquí si x > maxX
this.x = x;
this.y = y;
}
public static double getMaxX() {
return maxX;
}
public static void setMaxX(double maxX) {
// Se podría añadir validación para maxX (e.g., > 0)
Sprite.maxX = maxX;
}
public double getX() {
return x;
}
public void setX(double x) {
// Se podría añadir validación aquí si x > maxX
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
/**
* Mueve el sprite.
* @param ix incremento de x
* @param iy incremento de y
* @return nueva posición [x, y], o null si el nuevo valor de x excede el máximo permitido.
*/
public double[] mover(double ix, double iy) {
double nuevaX = x + ix;
if (nuevaX > maxX) {
return null; // O lanzar una excepción, o no mover
}
x = nuevaX;
y += iy;
return new double[]{x, y};
}
}
Filtrar Lista de Cadenas con ‘F’ en Java
Este programa lee cadenas de texto del usuario hasta que introduce “fin”, las almacena en una lista y luego crea una nueva lista que contiene solo las cadenas originales que incluyen la letra ‘F’ (mayúscula o minúscula).
import java.util.*;
import java.io.*;
public class App08A04 {
BufferedReader in;
public App08A04() {
in = new BufferedReader(new InputStreamReader(System.in));
}
public List<String> queContengaUnaF(List<String> unaLista) {
List<String> listaResultado = new ArrayList<>();
if (unaLista == null) return listaResultado; // Devolver lista vacía si la entrada es nula
for (String s : unaLista) {
if (s != null && s.toUpperCase().contains("F")) { // contains es más idiomático que indexOf >= 0
listaResultado.add(s);
}
}
return listaResultado;
}
public void run() throws Exception {
List<String> miLista = new ArrayList<>();
List<String> listaDeCadenasConF;
boolean esElCentinela;
System.out.println("Dame cadenas, y termina con \"fin\" cuando te canses");
do {
System.out.print("Cadena: ");
String s = in.readLine();
if (s == null) { // Manejar fin de stream inesperado
esElCentinela = true;
} else {
esElCentinela = s.equalsIgnoreCase("fin"); // Ignorar mayúsculas/minúsculas para "fin"
if (!esElCentinela) {
miLista.add(s);
}
}
} while (!esElCentinela);
System.out.print("La lista original: ");
for (int i = 0; i < miLista.size(); i++) {
System.out.print(miLista.get(i) + (i < miLista.size() - 1 ? ", " : ""));
}
System.out.println(); // Nueva línea
listaDeCadenasConF = queContengaUnaF(miLista);
System.out.print("La lista filtrada (contiene 'F'): ");
for (int i = 0; i < listaDeCadenasConF.size(); i++) {
System.out.print(listaDeCadenasConF.get(i) + (i < listaDeCadenasConF.size() - 1 ? ", " : ""));
}
System.out.println(); // Nueva línea
}
public static void main(String[] args) throws Exception {
new App08A04().run();
}
}
Invertir Array Devolviendo Copia en Java
Este método crea y devuelve una nueva copia invertida de un array de cadenas, sin modificar el original.
public String[] invertirArrayInvertido(String[] a) {
if (a == null) {
return null; // No se puede invertir un array nulo
}
String[] resultado = new String[a.length];
for (int i = 0; i < a.length; i++) {
resultado[i] = a[a.length - 1 - i];
}
return resultado;
}
Validación de Parentización con Pilas en Java
Este programa utiliza una pila (Deque
) para verificar si una expresión dada por el usuario tiene los paréntesis, corchetes y llaves correctamente balanceados y anidados.
import java.util.*;
import java.io.*;
public class AppParentizacion {
public boolean estaBienParentizado(String expr) {
if (expr == null) return true; // O false, según la definición
Deque<Character> pila = new ArrayDeque<>();
boolean bienParentizado = true;
int indice = 0;
while (bienParentizado && indice < expr.length()) {
char c = expr.charAt(indice);
if (c == '(' || c == '[' || c == '{') {
pila.push(c);
} else if (c == ')') {
if (pila.isEmpty() || pila.pop() != '(') {
bienParentizado = false;
}
} else if (c == ']') {
if (pila.isEmpty() || pila.pop() != '[') {
bienParentizado = false;
}
} else if (c == '}') {
if (pila.isEmpty() || pila.pop() != '{') {
bienParentizado = false;
}
}
// Ignorar otros caracteres
indice++;
}
// Al final, la pila debe estar vacía para que esté bien parentizado
return bienParentizado && pila.isEmpty();
}
public void run() throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String expr;
boolean esElCentinela;
System.out.println("Introduce expresiones para verificar parentización (o 'fin' para salir):");
do {
System.out.print("Expresión: ");
expr = in.readLine();
if (expr == null) {
esElCentinela = true;
} else {
esElCentinela = expr.equalsIgnoreCase("fin");
if (!esElCentinela) {
System.out.println(expr + (estaBienParentizado(expr) ? " --> OK" : " --> INCORRECTO"));
}
}
} while (!esElCentinela);
System.out.println("Adiós");
}
public static void main(String[] args) throws Exception {
new AppParentizacion().run();
}
}
Uso de Map para Contar Ciudades en Java
Este programa lee nombres de ciudades introducidos por el usuario y utiliza un Map
para contar cuántas veces se introduce cada nombre, hasta que el usuario escribe “fin”.
import java.util.*;
public class MainCiudades {
public static void main(String[] args) { // Firma estándar de main
Scanner in = new Scanner(System.in);
Map<String, Integer> mapas = new HashMap<>();
String nombre;
boolean centinela;
System.out.println("Dame el nombre de las ciudades (escribe 'fin' para terminar):");
do {
System.out.print("Ciudad: ");
nombre = in.nextLine();
centinela = nombre.equalsIgnoreCase("fin");
if (!centinela) {
if (!nombre.trim().isEmpty()) { // Evitar contar entradas vacías
// Incrementar el contador para la ciudad
// Opción 1: getOrDefault
// mapas.put(nombre, mapas.getOrDefault(nombre, 0) + 1);
// Opción 2: containsKey
if (!mapas.containsKey(nombre)) {
// System.out.println("El nombre no está, introduciéndolo."); // Mensaje opcional
mapas.put(nombre, 1);
} else {
// System.out.println("El nombre está en el Map, incrementando contador."); // Mensaje opcional
mapas.put(nombre, mapas.get(nombre) + 1);
}
} else {
System.out.println("Nombre vacío ignorado.");
}
}
} while (!centinela);
System.out.println("Adiós");
System.out.println("Recuento final de ciudades:");
// Imprimir el map de forma más legible
if (mapas.isEmpty()) {
System.out.println("No se introdujo ninguna ciudad.");
} else {
for (Map.Entry<String, Integer> entry : mapas.entrySet()) {
System.out.format(" %s: %d veces%n", entry.getKey(), entry.getValue());
}
}
// System.out.format("Contenido del Map: %s%n", mapas); // Imprime el map directamente
in.close(); // Cerrar el Scanner
}
}
Clasificar Palabras con Sets en Java
Este programa lee palabras del usuario. Utiliza conjuntos (Set
) predefinidos de frutas y verduras para clasificar cada palabra. Las palabras no clasificadas se almacenan en otro conjunto y al final se comprueba si alguna de las desconocidas contiene la letra ‘z’.
import java.io.*;
import java.util.*;
public class App08D03 {
public void run() throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
boolean esElCentinela;
boolean encontradoZ = false; // Renombrado para claridad
// Usar Sets para búsqueda eficiente (contains es O(1) en promedio)
Set<String> frutas = new HashSet<>(Arrays.asList("pera", "manzana", "naranja"));
Set<String> verduras = new HashSet<>(Arrays.asList("tomate", "pepino", "apio", "lechuga"));
Set<String> desconocidas = new HashSet<>();
System.out.println("Introduzca palabras seguidas de ENTER. Termine con 'fin':");
do {
System.out.print("Palabra: ");
String s = in.readLine();
if (s == null) {
esElCentinela = true; // Fin de stream
} else {
s = s.trim().toLowerCase(); // Normalizar entrada
esElCentinela = s.equals("fin");
if (!esElCentinela && !s.isEmpty()) {
if (frutas.contains(s)) {
System.out.println("--> fruta");
} else if (verduras.contains(s)) {
System.out.println("--> verdura");
} else {
System.out.println("--> desconocida");
desconocidas.add(s);
}
}
}
} while (!esElCentinela);
System.out.print("--> Introdujiste las siguientes palabras desconocidas: ");
if (desconocidas.isEmpty()) {
System.out.println("(ninguna)");
} else {
// Imprimir lista de desconocidas
StringJoiner sj = new StringJoiner(", ");
for (String d : desconocidas) {
sj.add(d);
}
System.out.println(sj.toString());
// Buscar 'z' en las desconocidas
Iterator<String> iter = desconocidas.iterator();
while (iter.hasNext() && !encontradoZ) {
String desconocida = iter.next();
if (desconocida.contains("z")) { // contains es más simple que indexOf >= 0
encontradoZ = true;
}
}
}
System.out.format("%s he encontrado una palabra desconocida que tenga una 'z'.%n",
encontradoZ ? "Sí," : "No,");
}
public static void main(String[] args) throws Exception {
new App08D03().run();
}
}
Ejemplo Básico de Javadoc
Un comentario Javadoc simple describiendo parámetros y valor de retorno.
/**
* Descripción breve del método.
*
* @param datosDeEntrada Descripción del parámetro de entrada.
* @return Descripción de lo que devuelve el método.
*/
public int miMetodo(String datosDeEntrada) {
// ... código del método ...
return 0; // Valor de ejemplo
}