Vous êtes sur la page 1sur 84

Arrays de Objetos Java - Netbeans 7.

Elaborar un programa en Java que permita registrar la informacin de los


libros en una Biblioteca, considerando la siguiente informacin: cdigo,
titulo, autor, editorial (Prentice Hall, Ra-Ma, Mc Graw Hill, Addison
Wesley), ao de edicin, especialidad (Programacin, Redes, Sistemas
Operativos, Diseo Grfico), cantidad de pginas.

******** MENU DE OPCIONES *******

[1] Agregar Libro. No se permite cdigos iguales.

[2] Mostrar Libros.

[3] Eliminar Libro por Nombre.

[4] Ordenar Libro por Nombre

[5] Modificar Libro por cdigo.

[6] Listado de libros de una determinada editorial.

[7] Listado de libros cuyo ao de edicin sea superior a un ao ingresado


por el usuario.

[8] Listado de libros de una especialidad determinada.

[9] Salir.
Implemente las clases y los mtodos necesarios que den solucin a la
Aplicacin
Crear un mtodo que valide si el arreglo se objetos est lleno, entonces
mostrar un mensaje correspondiente.

SOLUCION: Creamos la clase LIBRO


public class LIBRO {
private String CODIGO;
private String TITULO;
private String AUTOR;
private String EDITORIAL;
private String AOEDICION;
private String ESPECIALIDAD;
private String NUMPAG;

public String getCODIGO() {


return CODIGO;
}

public void setCODIGO(String CODIGO) {


this.CODIGO = CODIGO;
}

public String getTITULO() {


return TITULO;
}
public void setTITULO(String TITULO) {
this.TITULO = TITULO;
}

public String getAUTOR() {


return AUTOR;
}

public void setAUTOR(String AUTOR) {


this.AUTOR = AUTOR;
}

public String getEDITORIAL() {


return EDITORIAL;
}

public void setEDITORIAL(String EDITORIAL) {


this.EDITORIAL = EDITORIAL;
}

public String getAOEDIC ION() {


return AOEDIC ION;
}

public void setAOEDICION(String AOEDIC ION) {


this.AOEDIC ION = AOEDICION;
}

public String getESPECIALIDAD() {


return ESPECIALIDAD;
}

public void setESPECIALIDAD(String ESPECIALIDAD) {


this.ESPECIALIDAD = ESPECIALIDAD;
}

public String getNUMPAG() {


return NUMPAG;
}

public void setNUMPAG(String NUMPAG) {


this.NUMPAG = NUMPAG;
}
public String IMPRIMIR(){
return
getCODIGO()+"\t\t"+getTITULO()+"\t\t"+getAUTOR()+"\t\t"+getEDITO
RIAL()+"\t\t"+getAOEDIC ION()+"\t\t"+getESPEC IALIDAD()+"\t\t"+g
etNUMPAG()+"\n";
}
}

Programa para manipular la clase.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class APLICACIONJAVABIBLIOTECA {


static int POS;
static LIBRO BIBLIOTECA[]=ne w LIBRO[10];
public static boolean Verificar(){
if(POS==100){
System.out.print("LA BLIOTECA YA NO ACEPTA MAS LIBROS");
return true;
}
else return false;
}
public static void main(String[] args) throws IOException {
int opcion=1;
String CODIGO;
String TITULO;
String AUTOR;
String EDITORIAL;
String AOEDIC ION;
String ESPECIALIDAD;
String NUMPAG;
String eli="";
BufferedReader Teclado = new BufferedReader(ne w
InputStreamReade r(System.in));
do{
System.out.println("");
System.out.println("MENU BILIOTECA");
System.out.println("[1] Agregar Libro." );
System.out.println("[2] Mostrar Libros.");
System.out.println("[3] Eliminar Libro por Titulo.");
System.out.println("[4] Ordenar Libro por Titulo.");
System.out.println("[5] Modificar Libro por cdigo.");
System.out.println("[6] Listado de libros de una determinada editorial. ");
System.out.println("[7] Listado de libros cuyo ao de edicin sea superior
a un ao ingresado por el usuario.");
System.out.println("[8] Listado de libros de una especialidad
determinada.");
System.out.println("[9] Salir.");
System.out.print("Ingrese opcion <0 - 5> :");
opcion = Integer.parseInt(Teclado. readLine());
switch(opcion){
case 1:
boolean sw=false;
if (Verificar()==false){
do{
System.out.print("Ingrese codigo del libro:");
CODIGO=Tec lado.readLine();
sw=false;
if(POS>0){
for(int X=0;X<POS;X++)
if(BIBLIOTECA[X].getCODIGO().equalsIgnoreCase(CODIGO)==
true){
System.out.println("El codigo ya existe!!!!!");
sw=true;
}
}
}
while(sw);

System.out.print("Ingrese titulo del libro:");


TITULO=Teclado.readLine();
System.out.print("Ingrese autor del libro:");
AUTOR=Teclado.readLine();
System.out.print("Ingrese editorial del libro:");
EDITORIAL=Tec lado.readLine();
System.out.print("Ingrese ao de edicion del libro:");
AOEDIC ION=Teclado.readLine();
System.out.print("Ingrese especialidad del libro:");
ESPECIALIDAD=Teclado.readLine();
System.out.print("Ingrese numero de paginas del libro:");
NUMPAG=Teclado.readLine ();
LIBRO LIB=new LIBRO();
LIB.setCODIGO(CODIGO);
LIB.setTITULO(TITULO);
LIB.setAUTOR(AUTOR);
LIB.setAOEDICION(AOEDIC ION);
LIB.setEDITORIAL(EDITORIAL);
LIB.setESPECIALIDAD(ESPEC IALIDAD);
LIB.setNUMPAG(NUMPAG);
BIBLIOTECA[POS]=LIB;
System.out.print("Informac ion grabada correctamente:");
POS++;
}
break;
case 2:
System.out.println("Listado de libros");
System.out.println("CODIGO\t\tTITULO\t\tAUTOR\t\tEDITORIAL\t\
tAO EDICION\t\tESPEC IALIDAD\t\tNUM. PAG.");
for(int I=0;I<POS;I++){
System.out.print( BIBLIOTECA[I]. IMPRIMIR());
}
break;

case 3:
String ConBuscar;
String ELIMINAR="";
System.out.print("Ingrese Titulo del libro a buscar:");
ConBuscar=Teclado.readLine();
int I;
LIBRO AUX[]=ne w LIBRO[10];
boolean SW=false;
for(I=0;I<POS;I++){
if(ConBuscar.equalsIgnoreCase(BIBLIOTECA[I].getTITULO())==t
rue){
System.out.print("El libro existe...desea eliminarlo S/N?");
ELIMINAR=Teclado.readLine();
if(ELIMINAR.equalsIgnoreCase("S")==true){
for(int X=0;X<POS;X++)
if(X!=I) AUX[X]=BIBLIOTECA[I];
BIBLIOTECA=AUX;
POS--;
}
}
}
if(SW==false) System.out.print("El libro no existe...!!!");
break;
case 4:
System.out.println("ORDENAMIENTO POR TITULO");
LIBRO AUXI[]=ne w LIBRO[1];
int X,Y;
for(X=0;X<POS;X++)
for(Y=X+1;Y<POS;Y++)
if(BIBLIOTECA[X].getTITULO().compa re To(BIBLIOTECA[Y ].getTI
TULO())>0){
System.out.print("si ingresa");
AUXI[0]=BIBLIOTECA[X];
BIBLIOTECA[X]=BIBLIOTECA[Y ];
BIBLIOTECA[Y ]= AUXI[0];
}
break;
case 5:
String CodigoBuscar;
System.out.print("Ingrese codigo del libro a buscar:");
CodigoBuscar=Teclado.readLine();
boolean SW1=false;
for(I=0;I<POS;I++){
if(CodigoBuscar.equalsIgnoreCase(BIBLIOTECA[I].getCODIGO())
==true){
System.out.println("EL LIBRO EXISTE!!!!");
System.out.println("Ingrese datos del libro a modificar");
System.out.print("Ingrese titulo del libro:");
TITULO=Teclado.readLine();
System.out.print("Ingrese autor del libro:");
AUTOR=Teclado.readLine();
System.out.print("Ingrese editorial del libro:");
EDITORIAL=Teclado.readLine();
System.out.print("Ingrese ao de edicion del libro:");
AOEDIC ION=Teclado.readLine();
System.out.print("Ingrese especialidad del libro:");
ESPECIALIDAD=Teclado.readLine();
System.out.print("Ingrese numero de paginas del libro:");
NUMPAG=Teclado.readLine();
BIBLIOTECA[I].setTITULO(TITULO);
BIBLIOTECA[I].setAUTOR(AUTOR);
BIBLIOTECA[I].setAOEDIC ION(AOEDIC ION);
BIBLIOTECA[I].setEDITORIAL(EDITORIAL);
BIBLIOTECA[I].setESPEC IALIDAD(ESPEC IALIDAD);
BIBLIOTECA[I].setNUMPAG(NUMPAG);
SW1=true;
break;
}
}
if(SW1==false) System.out.print("El libro no existe...!!!");
break;

case 6:
String CodigoEditorial;
System.out.print("Ingrese editorial del libro a buscar:");
CodigoEditorial=Teclado.readLine();
boolean SW2=false;
System.out.println("CODIGO\t\tTITULO\t\tAUTOR\t\tEDITORIAL\t\
tAO EDICION\t\tESPEC IALIDAD\t\tNUM. PAG.");
for(I=0;I<POS;I++){
if(CodigoEditorial.equa lsIgnoreCase(BIBLIOTECA[I].getEDITORIA
L())==true){
System.out.print( BIBLIOTECA[I]. IMPRIMIR());
SW2=true;

}
}
if(SW2==false) System.out.print("No existen libros de esa
editorial...!!!");
break;

case 7:
String Ao;
System.out.print("Ingrese ao de edicion del libro a buscar:");
Ao=Teclado.readLine();
boolean SW4=false;
System.out.println("CODIGO\t\tTITULO\t\tAUTOR\t\tEDITORIAL\t\
tAO EDICION\t\tESPEC IALIDAD\t\tNUM. PAG.");
for(I=0;I<POS;I++){
if(BIBLIOTECA[I].getAOEDIC ION().compa re To(Ao)>0){
System.out.print( BIBLIOTECA[I]. IMPRIMIR());
SW4=true;

}
}
if(SW4==false) System.out.print("No existen libros en ese ao de
edicion...!!!");
break;

case 8:
String Especialidad;
System.out.print("Ingrese especilidad del libro a buscar:");
Especialidad=Teclado.readLine();
boolean SW3=false;
System.out.println("CODIGO\t\tTITULO\t\tAUTOR\t\tEDITORIAL\t\
tAO EDICION\t\tESPEC IALIDAD\t\tNUM. PAG.");
for(I=0;I<POS;I++){
if(Especialidad.equalsIgnoreCase(BIBLIOTECA[I].getESPEC IALID
AD())==true){
System.out.print( BIBLIOTECA[I]. IMPRIMIR());
SW3=true;

}
}
if(SW3==false) System.out.print("No existen libros de esa
espacialidad...!!!");
break;
}
}
while (opcion!=9);
}

Gestion Academica - Java - Netbeans 7.4 - Swing.


El rea de gestin de acadmica de la universidad maneja informacin
sobre la matrcula de los alumnos en su respectiva Facultad y Escuelas de
la universidad, para lo cual requiere de una aplicacin de software,
desarrollada en el lenguaje de programacin Java bajo un enfoque
orientada a objetos, en la que entre otros aspectos permita llevar un
registro actualizado de las matrculas de los alumnos, teniendo en
consideracin que si el alumno selecciona una facultad, solo debe
visualizar las escuelas que pertenecen a esa facultad y luego puede
seleccionar su condicin (Activo/Desactivo) .

As como tambin se pueden realizar bsquedas de alumnos por su


respectiva facultad
Se le Pide:
Implementar un formulario de mantenimiento, como se muestra luego, a
fin de permitirle al usuario mantener un registro actualizado de datos de
los alumnos de la Universidad.

import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

public class MATRICULA extends javax.swing.JFrame {


DefaultTableModel Tabla=new DefaultTableModel();
int POS=0;
int NUMCODIGO=1;
int Z=0;
ALUMNO []SALON=new ALUMNO[30];
public MATRICULA() {
initComponents();
String []TITULOS={"CODIGO","NOMB RE","FACULTAD","ESCUELA","CONDICION"};
Tabla.setColumnIdentifiers(TITULOS );
jTable1.setModel(Tabla);
jTextField1.setText(NUMCODIGO+"");
jComboBox1ItemStateChanged(null);
}

private void btnGuardarActionPerformed(java. awt.event.ActionE vent evt)


{
String CODIGO,NOMBRE,FACULTA D,ESCUELA;
String CONDICION="";
CODIGO=jTextField1.getText();
NOMBRE=jTextField2.getText();
FACULTAD=jComboBox 1.getSelectedIt em().toString();
ESCUELA=jComboBox2.getSelectedItem().toString();
if(jCheckBox1.isSelected()==true) CONDICION="ACTIV O";
if(jCheckBox1.isSelected()==false) CONDICION="DESACTIVO";
ALUMNO AL=new ALUMNO();
AL.setCodigo(CODIGO);
AL.setNombre(NOMBRE);
AL.setFacultad(FACULTAD);
AL.setEscuela(ESCUELA);
AL.setCondicion(CONDICION);
SALON[POS]=AL;
String DATOS[]={CODIGO, NOMB RE,FACULTA D,ESCUE LA,CONDICION};
Tabla.addRow(DA TOS );
POS++;
NUMCODIGO++;
jTextField1.setText(NUMCODIGO+"");
}
private void btnCancelarActionPerformed(java.awt.event.ActionE vent evt )
{
jTable1.setModel(Tabla);
jTextField2.setText("");
jCheckBox1.setSelected(false);
jTextField1.requestFocus();
}
private void btnNuevoActionPerformed(java.awt.event.ActionE vent evt)
{
jTextField1.setText("");
jTextField2.setText("");
jCheckBox1.setSelected(false);
jTextField1.setText(NUMCODIGO+"");
jTextField1.requestFocus();
}
private void btnModificarActionPerformed(java.awt.event.ActionE vent evt)
{
int X=0;
btnGuardar.setEnabled(false);
if(btnModificar.getText()=="MODIFICA R"){
btnModificar.setText("ACTUALIZAR");
String CODIGO;
boolean SW=false;
CODIGO=JOptionPane.showInputDialog(null,"Ingrese codigo del alumno a modificar:");
for(X=0; X<POS; X++)
if(CODIGO.equals IgnoreCase(SA LON[ X].get Codigo())==true){
SW=true;
jTextField1.setText(SALON[ X].getCodigo());
jTextField2.setText(SALON[ X].getNombre());
jComboBox1.setSelectedItem(SALON[ X].getFacultad());
jComboBox2.setSelectedItem(SALON[ X].getEscuela());
if(SALON[X].getCondicion().equalsIgnoreCase("ACTIV O"))
jCheckBox1.setSelected(true);
if(SALON[X].getCondicion().equalsIgnoreCase("DESA CTIVO"))
jCheckBox1.setSelected(false);
Z=X;
break;
}
if(SW==false)
JOptionPane.showMessageDialog(null,"No existe el codigo del alumno...");
}
else if(btnModificar.get Text()=="ACTUALIZA R"){
btnModificar.setText("MODIFICAR");
String CODIGO,NOMBRE,FACULTA D,ESCUELA;
String CONDICION="";
CODIGO=jTextField1.getText();
NOMBRE=jTextField2.getText();
FACULTAD=jComboBox 1.getSelectedIt em().toString();
ESCUELA=jComboBox2.getSelectedItem().toString();
if(jCheckBox1.isSelected()==true) CONDICION="ACTIV O";
if(jCheckBox1.isSelected()==false) CONDICION="DESACTIVO";
Tabla.removeRow(Z);
String DATOS[]={CODIGO, NOMB RE,FACULTA D,ESCUE LA,CONDIC ION};
Tabla.addRow(DA TOS );
JOptionPane.showMessageDialog(null,"Datos actualizados correctamente...");
btnGuardar.setEnabled(true);
}
}

private void btnEliminarActionPerformed(java.awt.event.ActionE vent evt)


{
int X=0;
String CODIGO;

boolean SW=false;
CODIGO=JOptionPane.showInputDialog(null,"Ingrese codigo del alumno a modificar:");
for(X=0; X<POS; X++)
if(CODIGO.equals IgnoreCase(SA LON[ X].get Codigo())==true){
SW=true;
Tabla.removeRow(X);
jTable1.setModel(Tabla);

JOptionPane.showMessageDialog(null,"Datos eliminados correctamente. ..");


POS--;
// NUMCODIGO++;
// jTextField1.setText(NUMCODIGO+"");

break;

}
if(SW==false)
JOptionPane.showMessageDialog(null,"No existe el codigo del alumno...");
}
private void btnCerrarActionPerformed(java.awt.event.ActionE vent evt)
{
System.exit(0);
}
private void jComboBox1ItemStateChanged(java. awt.event.ItemE vent evt )
{
jComboBox2.removeAllItems();
if(jComboBox1.getSelectedItem().toString().equalsIgnoreCase("CIE NCIAS DE LA
SALUD")==true){
jComboBox2.addItem("Medicina Humana");
jComboBox2.addItem("Obstetricia");
jComboBox2.addItem("Enfermeria" );
jComboBox2.addItem(" Nutricion");
jComboBox2.addItem("Farmacia y BioQuimica");
jComboBox2.addItem("Psicologia");
}
if(jComboBox1.getSelectedItem().toString().equals IgnoreCase(" HUMA NIDA DES")==true
){
jComboBox2.addItem("Literatura");
jComboBox2.addItem("Filosofia");
jComboBox2.addItem("Educacion Inicial");

}
if(jComboBox1.getSelectedItem().toString().equals IgnoreCase(" CIE NCIAS
SOCIALES")==true){
jComboBox2.addItem("Derecho");
jComboBox2.addItem("Ciencia Politica");
jComboBox2.addItem("Trabajo Social");
}
if(jComboBox1.getSelectedItem().toString().equalsIgnoreCase("CIE NCIAS
BASICAS")==true){
jComboBox2.addItem("Quimica");
jComboBox2.addItem("Fisica");
jComboBox2.addItem("Matematica");
}
if(jComboBox1.getSelectedItem().toString().equalsIgnoreCase("INGE NIE RIAS")==true){
jComboBox2.addItem("Ingenieria Quimica");
jComboBox2.addItem("Ingenieria de Minas");
jComboBox2.addItem("Ingenieria de Sistemas");
}
}

private void jButton1ActionPerformed(java.awt.event.ActionE vent evt)


{
int X=0;
String FACULTAD;
DefaultTableModel Tabla1=new DefaultTableModel();
String []TITULOS1={"CODIGO","NOMBRE","FACULTA D","ESCUELA","CONDICION"};
Tabla1.setColumnIdentifiers(TITULOS1);
jTable1.setModel(Tabla1);
boolean SW=false;
FACULTAD=jTextField3. get Text();
for(X=0; X<POS; X++)
if(FACULTAD.equalsIgnoreCase(SALON[ X].getFacultad())==true){
SW=true;
String
DATOS1[]={SALON[X].getCodigo(),SALON[ X].getNombre(),SALON[ X].getFacultad(),SALON[ X]
.getEscuela(),SALON[X].getCondicion()};
Tabla1.addRow(DA TOS1);
}
if(SW==false)
JOptionPane.showMessageDialog(null,"La facultad no existe...!!!!");

Publicado por Krlos K en 4:54 1 comentario:


Enviar por correo electrnicoEscribe un blogCompartir con TwitterCompartir con
FacebookCompartir en Pinterest
Herencia y Polimorfismo y Clases Abstractas -
Ejemplo Banco - Java - Netbeans 7.4

En un banco las cuentas pueden ser de dos tipos: cuentas de ahorro y


cuentas de inversin.
Un cliente puede depositar o retirar de una cuenta de ahorro, el primer
deposito que hace debe ser de $1,000 invariablemente, para cada retiro el
cliente pude retirar lo que desee, pero la cuenta nunca puede quedarse en
ceros, al menos debe haber $500. Dependiendo de la cuenta, se maneja un
porcentaje de ahorro anual, esto es definido en el momento que se crea la
cuenta de ahorro, y cada mes se deben calcular los intereses debidos para
incrementar el saldo de la cuenta.
SOLUCION: Creamos la clase abstracta CLIENTE
public abstract class Cliente {
private String NUMCUENTA;
private String NOMBRE;

public String getNUMCUENTA() {


return NUMCUENTA;
}
public void setNUMCUENTA(String NUMCUENTA) {
this.NUMCUENTA = NUMCUENTA;
}

public String getNOMBRE() {


return NOMBRE;
}

public void setNOMBRE(String NOMBRE) {


this.NOMBRE = NOMBRE;
}
public abstract void setRetiro(double Cantidad);
}

Clase CuentaAhorros

import javax.swing.JOptionPane;

public class CuentaAhorros extends Cliente {


private double Saldo;
private double InteresAnual;
private static int C;
CuentaAhorros(){
this.C=1;
}

public double getSaldo() {


return Saldo;
}

public void setSaldo(double Saldo) {


this.Saldo = Saldo;
}

public double getInteresAnual() {


return InteresAnual;
}

public void setInteresAnual(double InteresAnual) {


this.InteresAnual = InteresAnual;
}

public void setDeposito(double


Cantidad) {
if(C==1){
if(Cantidad<1000)
System.out.println("La apertura debe ser con $1000....!!!");
else {
this.Saldo = Saldo+Cantidad;
C++;
}
}
else{
if(Cantidad<=0)
System.out.println("Ingrese cantidad mayor a 0");
else {
this.Saldo = Saldo+Cantidad;
C++;
}
}
}
public void setRetiro(double Cantidad) {
if(Cantidad>Saldo)
{
System.out.println("No puede retirar mas de lo que tiene");
}
else
{
if(Cantidad<=0)
System.out.println("Ingrese cantidad mayor a 0");
else
{
this.Saldo = Saldo-Cantidad;
if(Saldo<=500)
{
System.out.println("Saldo minimo en ahorros es de 500...!!!");
this.Saldo = Saldo+Cantidad;
}
}
}
}
public void setInteres() {
this.Saldo = Saldo+Saldo*(this.InteresAnual/12)/100;
}
}
Clase CuentaInversion

public class CuentaInversion extends Cliente {


private double Saldo;

public CuentaInversion(){
this.Saldo=25000;
}
public void setRetiro(double Cantidad) {
if(Cantidad>Saldo){
System.out.println("No puede retirar mas de lo que tiene...!!!");
}
else
{
if (Cantidad==Saldo)
{
System.out.println("Va a retirar todo su dinero...!!!");
this.Saldo = Saldo-Cantidad;
}
else
{
if(Cantidad<=0)
System.out.println("Ingrese cantidad mayor a 0");
else
{
this.Saldo = Saldo-Cantidad;
if(Saldo<=10000)
{
System.out.println("Saldo minimo en ahorros es de 500...!!!");
this.Saldo = Saldo+Cantidad;
}
}
}
}
}

public double getSaldo() {


return Saldo;
}
public void setSaldo(double Saldo) {
this.Saldo = Saldo;
}

}
Clase principal para manipular las clases.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class APLICACIONJAVABANCO {
int POS=0;
static CuentaAhorros CA=new CuentaAhorros();
static CuentaInversion CI=new CuentaInversion();
public static void main(String[] args) throws IOException {
double DEPOSITO,RETIRO;
BufferedReader Teclado=new BufferedReader(new
InputStreamReader(System.in));
int OPCION1=0,OPCION2=0,OPCION3=0;
do{
System.out.println("****************************************
**************");
System.out.println("MENU PRINCIPAL");
System.out.println("[0] INGRESE DATOS DEL CLIENTE");
System.out.println("[1] SELECCIONE TIPO CUENTA");
System.out.println("[2] MOSTRAR SALDO CUENTA DE AHORRO");
System.out.println("[3] MOSTRAR SALDO CUENTA DE INVERSION");
System.out.println("[4] SALIR");
System.out.println("****************************************
**************");
System.out.print("Ingresar opcion <1 - 4 >:");
OPCION1=Integer.parseInt(Teclado.readLine());
switch(OPCION1){
case 0:
String NUMCUENTAS,NOMBRES;
System.out.println("\nINGRESE DATOS DEL CLIENTE");
System.out.print("Ingrese numero de cuenta:");
NUMCUENTAS=Teclado.readLine();
System.out.print("Ingrese nombre del cliente:");
NOMBRES=Teclado.readLine();
CA.setNOMBRE(NOMBRES);
CA.setNUMCUENTA(NUMCUENTAS);
CI.setNOMBRE(NOMBRES);
CI.setNUMCUENTA(NUMCUENTAS);
break;
case 1:
System.out.println("\nTIPOS DE CUENTAS");
System.out.println("[3] CUENTA DE AHORRO");
System.out.println("[4] CUENTA DE INVERSION");
System.out.print("Ingresar tipo de cuenta <3 - 5 >:");
OPCION2=Integer.parseInt(Teclado.readLine());
if(OPCION2==3)
{
System.out.println("TIPOS DE OPERACION");
System.out.println("[5] DEPOSITO");
System.out.println("[6] RETIRO");
System.out.print("Ingresar tipo de cuenta <5 - 6 >:");
OPCION3=Integer.parseInt(Teclado.readLine());
if(OPCION3==5){
System.out.print("Ingresar cantidad a depositar:");
DEPOSITO=Integer.parseInt(Teclado.readLine());
CA.setDeposito(DEPOSITO);

}
if(OPCION3==6){
System.out.print("Ingresar cantidad a retirar:");
RETIRO=Integer.parseInt(Teclado.readLine());
CA.setRetiro(RETIRO);
}
}
if(OPCION2==4)
{
System.out.println("TIPOS DE OPERACION");
System.out.println("[8] RETIRO");
System.out.print("Ingresar tipo de cuenta <8 - 8>:");
OPCION3=Integer.parseInt(Teclado.readLine());
System.out.print("Ingresar cantidad a retirar:");
RETIRO=Integer.parseInt(Teclado.readLine());
CI.setRetiro(RETIRO);
}
break;
case 2:
System.out.println("TOTAL DE SALDO EN SU CUENTA DE
AHORRO");
System.out.println("NUMERO DE CUENTA=" +
CA.getNUMCUENTA());
System.out.println("NOMBRE=" + CA.getNOMBRE());
System.out.println("SALDO="+CA.getSaldo());
break;
case 3:
System.out.println("TOTAL DE SALDO EN SU CUENTA DE
INVERSION");
System.out.println("NUMERO DE CUENTA=" +
CI.getNUMCUENTA());
System.out.println("NOMBRE=" + CI.getNOMBRE());
System.out.println("SALDO=" +CI.getSaldo());
break;
}
}
while(OPCION1!=4);
}

}
Publicado por Krlos K en 4:41 No hay comentarios:
Enviar por correo electrnicoEscribe un blogCompartir con TwitterCompartir con
FacebookCompartir en Pinterest
Arrays de Objetos Java - Netbeans 7.4

Elaborar un programa en Java que permita registrar la informacin de los


libros en una Biblioteca, considerando la siguiente informacin: cdigo,
titulo, autor, editorial (Prentice Hall, Ra-Ma, Mc Graw Hill, Addison
Wesley), ao de edicin, especialidad (Programacin, Redes, Sistemas
Operativos, Diseo Grfico), cantidad de pginas.

******** MENU DE OPCIONES *******

[1] Agregar Libro. No se permite cdigos iguales.

[2] Mostrar Libros.

[3] Eliminar Libro por Nombre.

[4] Ordenar Libro por Nombre

[5] Modificar Libro por cdigo.

[6] Listado de libros de una determinada editorial.

[7] Listado de libros cuyo ao de edicin sea superior a un ao ingresado


por el usuario.

[8] Listado de libros de una especialidad determinada.

[9] Salir.
Implemente las clases y los mtodos necesarios que den solucin a la
Aplicacin
Crear un mtodo que valide si el arreglo se objetos est lleno, entonces
mostrar un mensaje correspondiente.

SOLUCION: Creamos la clase LIBRO


public class LIBRO {
private String CODIGO;
private String TITULO;
private String AUTOR;
private String EDITORIAL;
private String AOEDICION;
private String ESPECIALIDAD;
private String NUMPAG;

public String getCODIGO() {


return CODIGO;
}

public void setCODIGO(String CODIGO) {


this.CODIGO = CODIGO;
}
public String getTITULO() {
return TITULO;
}

public void setTITULO(String TITULO) {


this.TITULO = TITULO;
}

public String getAUTOR() {


return AUTOR;
}

public void setAUTOR(String AUTOR) {


this.AUTOR = AUTOR;
}

public String getEDITORIAL() {


return EDITORIAL;
}

public void setEDITORIAL(String EDITORIAL) {


this.EDITORIAL = EDITORIAL;
}

public String getAOEDIC ION() {


return AOEDIC ION;
}

public void setAOEDICION(String AOEDIC ION) {


this.AOEDIC ION = AOEDICION;
}

public String getESPECIALIDAD() {


return ESPECIALIDAD;
}

public void setESPECIALIDAD(String ESPECIALIDAD) {


this.ESPECIALIDAD = ESPECIALIDAD;
}

public String getNUMPAG() {


return NUMPAG;
}

public void setNUMPAG(String NUMPAG) {


this.NUMPAG = NUMPAG;
}
public String IMPRIMIR(){
return
getCODIGO()+"\t\t"+getTITULO()+"\t\t"+getAUTOR()+"\t\t"+getEDITO
RIAL()+"\t\t"+getAOEDIC ION()+"\t\t"+getESPEC IALIDAD()+"\t\t"+g
etNUMPAG()+"\n";
}
}

Programa para manipular la clase.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class APLICACIONJAVABIBLIOTECA {


static int POS;
static LIBRO BIBLIOTECA[]=ne w LIBRO[10];
public static boolean Verificar(){
if(POS==100){
System.out.print("LA BLIOTECA YA NO ACEPTA MAS LIBROS");
return true;
}
else return false;
}
public static void main(String[] args) throws IOException {
int opcion=1;
String CODIGO;
String TITULO;
String AUTOR;
String EDITORIAL;
String AOEDIC ION;
String ESPECIALIDAD;
String NUMPAG;
String eli="";
BufferedReader Teclado = new BufferedReader(ne w
InputStreamReade r(System.in) );
do{
System.out.println("");
System.out.println("MENU BILIOTECA");
System.out.println("[1] Agregar Libro." );
System.out.println("[2] Mostrar Libros.");
System.out.println("[3] Eliminar Libro por Titulo.");
System.out.println("[4] Ordenar Libro por Titulo.");
System.out.println("[5] Modificar Libro por cdigo.");
System.out.println("[6] Listado de libros de una determinada editorial.");
System.out.println("[7] Listado de libros cuyo ao de edicin sea superior
a un ao ingresado por el usuario.");
System.out.println("[8] Listado de libros de una especialidad
determinada.");
System.out.println("[9] Salir.");
System.out.print("Ingrese opcion <0 - 5> :");
opcion = Integer.parseInt(Teclado. readLine());
switch(opcion){
case 1:
boolean sw=false;
if (Verificar()==false){
do{
System.out.print("Ingrese codigo del libro:");
CODIGO=Tec lado.readLine();
sw=false;
if(POS>0){
for(int X=0;X<POS;X++)
if(BIBLIOTECA[X].getCODIGO().equalsIgnoreCase(CODIGO)==
true){
System.out.println("El codigo ya existe!!!!!");
sw=true;
}
}
}
while(sw);

System.out.print("Ingrese titulo del libro:");


TITULO=Teclado.readLine();
System.out.print("Ingrese autor del libro:");
AUTOR=Teclado.readLine();
System.out.print("Ingrese editorial del libro:");
EDITORIAL=Tec lado.readLine();
System.out.print("Ingrese ao de edicion del libro:");
AOEDIC ION=Teclado.readLine();
System.out.print("Ingrese especialidad del libro:");
ESPECIALIDAD=Teclado.readLine();
System.out.print("Ingrese numero de paginas del libro:");
NUMPAG=Teclado.readLine ();
LIBRO LIB=new LIBRO();
LIB.setCODIGO(CODIGO);
LIB.setTITULO(TITULO);
LIB.setAUTOR(AUTOR);
LIB.setAOEDICION(AOEDIC ION);
LIB.setEDITORIAL(EDITORIAL);
LIB.setESPECIALIDAD(ESPEC IALIDAD);
LIB.setNUMPAG(NUMPAG);
BIBLIOTECA[POS]=LIB;
System.out.print("Informac ion grabada correctamente:");
POS++;
}
break;
case 2:
System.out.println("Listado de libros");
System.out.println("CODIGO\t\tTITULO\t\tAUTOR\t\tEDITORIAL\t\
tAO EDICION\t\tESPEC IALIDAD\t\tNUM. PAG.");
for(int I=0;I<POS;I++){
System.out.print( BIBLIOTECA[I]. IMPRIMIR());
}
break;

case 3:
String ConBuscar;
String ELIMINAR="";
System.out.print("Ingrese Titulo del libro a buscar:");
ConBuscar=Teclado.readLine();
int I;
LIBRO AUX[]=ne w LIBRO[10];
boolean SW=false;
for(I=0;I<POS;I++){
if(ConBuscar.equalsIgnoreCase(BIBLIOTECA[I].getTITULO())==t
rue){
System.out.print("El libro existe...desea eliminarlo S/N?");
ELIMINAR=Teclado.readLine();
if(ELIMINAR.equalsIgnoreCase("S")==true){
for(int X=0;X<POS;X++)
if(X!=I) AUX[X]=BIBLIOTECA[I];
BIBLIOTECA=AUX;
POS--;
}
}
}
if(SW==false) System.out.print("El libro no existe...!!!");
break;
case 4:
System.out.println("ORDENAMIENTO POR TITULO");
LIBRO AUXI[]=ne w LIBRO[1];
int X,Y;
for(X=0;X<POS;X++)
for(Y=X+1;Y<POS;Y++)
if(BIBLIOTECA[X].getTITULO().compa re To(BIBLIOTECA[Y ].getTI
TULO())>0){
System.out.print("si ingresa");
AUXI[0]=BIBLIOTECA[X];
BIBLIOTECA[X]=BIBLIOTECA[Y ];
BIBLIOTECA[Y ]= AUXI[0];
}
break;
case 5:
String CodigoBuscar;
System.out.print("Ingrese codigo del libro a buscar:");
CodigoBuscar=Teclado.readLine();
boolean SW1=false;
for(I=0;I<POS;I++){
if(CodigoBuscar.equalsIgnoreCase(BIBLIOTECA[I].getCODIGO())
==true){
System.out.println("EL LIBRO EXISTE!!!!");
System.out.println("Ingrese datos del libro a modificar");
System.out.print("Ingrese titulo del libro:");
TITULO=Teclado.readLine();
System.out.print("Ingrese autor del libro:");
AUTOR=Teclado.readLine();
System.out.print("Ingrese editorial del libro:");
EDITORIAL=Teclado.readLine();
System.out.print("Ingrese ao de edicion del libro:");
AOEDIC ION=Teclado.readLine();
System.out.print("Ingrese especialidad del libro:");
ESPECIALIDAD=Teclado.readLine();
System.out.print("Ingrese numero de paginas del libro:");
NUMPAG=Teclado.readLine();
BIBLIOTECA[I].setTITULO(TITULO);
BIBLIOTECA[I].setAUTOR(AUTOR);
BIBLIOTECA[I].setAOEDIC ION(AOEDIC ION);
BIBLIOTECA[I].setEDITORIAL(EDITORIAL);
BIBLIOTECA[I].setESPEC IALIDAD(ESPEC IALIDAD);
BIBLIOTECA[I].setNUMPAG(NUMPAG);
SW1=true;
break;
}
}
if(SW1==false) System.out.print("El libro no existe...!!!");
break;

case 6:
String CodigoEditorial;
System.out.print("Ingrese editorial del libro a buscar:");
CodigoEditorial=Teclado.readLine();
boolean SW2=false;
System.out.println("CODIGO\t\tTITULO\t\tAUTOR\t\tEDITORIAL\t\
tAO EDICION\t\tESPEC IALIDAD\t\tNUM. PAG.");
for(I=0;I<POS;I++){
if(CodigoEditorial.equa lsIgnoreCase(BIBLIOTECA[I].getEDITORIA
L())==true){
System.out.print( BIBLIOTECA[I]. IMPRIMIR());
SW2=true;

}
}
if(SW2==false) System.out.print("No existen libros de esa
editorial...!!!");
break;

case 7:
String Ao;
System.out.print("Ingrese ao de edicion del libro a buscar:");
Ao=Teclado.readLine();
boolean SW4=false;
System.out.println("CODIGO\t\tTITULO\t\tAUTOR\t\tEDITORIAL\t\
tAO EDICION\t\tESPEC IALIDAD\t\tNUM. PAG.");
for(I=0;I<POS;I++){
if(BIBLIOTECA[I].getAOEDIC ION().compa re To(Ao)>0){
System.out.print( BIBLIOTECA[I]. IMPRIMIR());
SW4=true;

}
}
if(SW4==false) System.out.print("No existen libros en ese ao de
edicion...!!!");
break;

case 8:
String Especialidad;
System.out.print("Ingrese especilidad del libro a buscar:");
Especialidad=Teclado.readLine();
boolean SW3=false;
System.out.println("CODIGO\t\tTITULO\t\tAUTOR\t\tEDITORIAL\t\
tAO EDICION\t\tESPEC IALIDAD\t\tNUM. PAG.");
for(I=0;I<POS;I++){
if(Especialidad.equalsIgnoreCase(BIBLIOTECA[I].getESPEC IALID
AD())==true){
System.out.print( BIBLIOTECA[I]. IMPRIMIR());
SW3=true;

}
}
if(SW3==false) System.out.print("No existen libros de esa
espacialidad...!!!");
break;
}
}
while (opcion!=9);
}

}
Ordenar un ArrayList en Java

El proyecto de este post lo puedes descargar pulsando AQUI.

Una de las funcionalidades ms interesantes a la hora de trabajar con


estructuras de datos tipo "pila", "cola", "lista" etc. es su ordenacin. En el post de
"Ordenar Arrays en Java (Con sus indices)" implementamos un API que nos
permita ordenar Arrays y sus indices, que es una funcionalidad muy importante
que no ha sido implementada por ningn API conocida y de forma sencilla.

En este post vamos a mostrar como ordenar ArrayList, bien sea con un
ArrayList de datos atmicos o con un ArrayList de objetos.

Para realizar estas operaciones necesitaremos trabajar con la Clase


"Collections" de Java. No vamos a explicar las caractersticas de esta clase, sino
que simplemente vamos a utilizarla para ordenar ArrayList's. Como suele ser
habitual en esta web, pasamos a mostrar esta funcionalidad con un ejemplo:

Vamos a tener un ArrayList llamado "arrayListInt" que es un array de


enteros y que le pondremos los siguientes valores (sino sabis el mtodo add,
mirar el post "ArrayList en Java, con ejemplos"):

private static ArrayList arrayListInt = new ArrayList<>();

// Guardo datos en el ArrayList

arrayListInt.add(3); arrayListInt.add(4);

arrayListInt.add(2); arrayListInt.add(6);

arrayListInt.add(5); arrayListInt.add(1);

arrayListInt.add(7);

Si imprimimos este ArrayList en el orden en el que hemos guardado los


elementos, tendremos que el primer elemento sera el numer '3', el segundo el
nmero '6' y si seguimos el orden, el ltimo ser el nmero '7'.

Para ordenar este ArrayList de menor a mayor, vamos a utilizar el mtodo


"sort" de la clase Collections:
Collections.sort(arrayListInt);

Con este mtodo nos devolver el ArrayList ordenado de menor a mayor,


siendo la salida la siguiente (en el proyecto que os podis descargar, podis ver
los mtodo que imprimen por pantalla los ArrayList):

Posicion(1) = 1

Posicion(2) = 2

Posicion(3) = 3

Posicion(4) = 4

Posicion(5) = 5

Posicion(6) = 6

Posicion(7) = 7

Para ordenarlo de mayor a menor, tenemos que crearnos un objeto de la


clase Comparator para que compare los elementos y los ponga en orden inverso.
Esto lo hacemos de la siguiente manera:

Comparator<Integer> comparador = Collections.reverseOrder();

Collections.sort(arrayListInt, comparador);

Ejecutando esta parte del programa e imprimiendo por pantalla el ArrayList


resultante, tenemos el ArrayList ordenado de mayor a menor:

Posicion(1) = 7

Posicion(2) = 6

Posicion(3) = 5

Posicion(4) = 4

Posicion(5) = 3

Posicion(6) = 2

Posicion(7) = 1
Pero Que pasa si lo que tenemos es un ArrayList de objetos de una
determinada clase y lo que queremos ordenar ese ArrayList por el valor de un
determinado atributo?. Bueno pues hay una sencilla solucin que vamos a mostrar
a continuacin y que consiste en sobreescribir un mtodo de la clase Comparator.
Supongamos que tenemos una clase "Persona" de la siguiente forma:

class Persona {

private String nombre;

private int edad;

public Persona() {

public Persona(String nombre, int edad) {

this.nombre = nombre;

this.edad = edad;

public String getNombre() {

return nombre;

public void setNombre(String nombre) {

this.nombre = nombre;

public int getEdad() {

return edad;

}
public void setEdad(int edad) {

this.edad = edad;

@Override

public String toString() {

return this.getNombre() + " - " + this.getEdad();

Supongamos que tenemos un ArrayList llamado "personas" con los


siguientes objetos de la clase persona:

private static ArrayList personas = new ArrayList<>();

................

................

personas.add(new Persona("Pepe", 28));

personas.add(new Persona("Juan", 32));

personas.add(new Persona("Paco", 40));

personas.add(new Persona("Susi", 24));

personas.add(new Persona("Lola", 20));

personas.add(new Persona("Jose", 28));

personas.add(new Persona("Dani", 24));

personas.add(new Persona("Sara", 36));

Este ArrayList lo queremos ordenar (de menor a mayor edad) en funcin de


la edad de las personas, por tanto tenemos que sobre escribir el mtodo
"compare" de la clase Comparator y llamar al mtodo "sort" de la clase collections.
Esto lo hacemos de la siguiente forma:

Collections.sort(personas, new Comparator() {


@Override

public int compare(Persona p1, Persona p2) {

return new Integer(p1.getEdad()).compareTo(new Integer(p2.ge


tEdad()));

});

Como vemos lo que hace el mtodo "compare" es comparar dos edades


dadas. En este caso estamos comparando dos atributos de tipo "Integer". Si lo
queremos hacer con un String, Double, etc. solo tenemos que cambiar el tipo de
dato. Como salida a este cdigo tenemos lo siguiente:

Posicion(1) = Lola - 20

Posicion(2) = Dani - 24

Posicion(3) = Susi - 24

Posicion(4) = Pepe - 28

Posicion(5) = Jose - 28

Posicion(6) = Juan - 32

Posicion(7) = Sara - 36

Posicion(8) = Paco - 40

Si ahora queremos ordenarlo de mayor a menor edad, solo tenemos que


cambiar el mtodo "compare" poniendo la comparacin al revs:

Collections.sort(personas, new Comparator() {

@Override

public int compare(Persona p1, Persona p2) {

// Aqui esta el truco, ahora comparamos p2 con p1 y no al re


ves como antes

return new Integer(p2.getEdad()).compareTo(new Integer(p1.ge


tEdad()));

}
});

Como resultado de esta ordenacin obtenemos lo siguiente:

Posicion(1) = Paco - 40

Posicion(2) = Sara - 36

Posicion(3) = Juan - 32

Posicion(4) = Pepe - 28

Posicion(5) = Jose - 28

Posicion(6) = Dani - 24

Posicion(7) = Susi - 24

Posicion(8) = Lola - 20

Esto es en resumen todo lo necesario para ordenar ArrayList, bien sean por
un atributo de una serie de objetos o con datos atmicos (en realidad son objetos
que representan datos atmicos, Integer, Double, etc.). No hemos entrado en
detalle de explicar las clases Comparator y Collections ya que en principio la
finalidad de este post es la de dar una solucin a la ordenacin de ArrayList.

Ordenar Arrays en Java (con sus


indices)

El proyecto realizado en este tutorial lo podeis descargar pinchando AQUI.


El API SortArray_1.0.jar y el JavaDoc, lo podeis descargar pinchando AQUI.

Todos los que habis hecho o estais haciendo la carrera de ingeniera


informtica, habis tenido que ver en alguna asignatura (en mi caso en la
asignatura de Algortmica y Complejidad) los mtodos de ordenacin de arrays,
ya que aunque se trate de algo muy trivial, no lo es tanto si se tienen que ordenar
arrays de un tamao considerable, ya que los algoritmos de ordenacin de arrays
tiene complejidad O(n^2).

Por hacer un breve resumen de los mtodos de ordenacin de arrays (sin


entrar en sus detalles) se ha de decir que estos mtodos se clasifican en 3 tipos
que son: 1.- Mtodos de insercin, 2.- Mtodos de Seleccin y 3.- Mtodos de
intercambio. Dentro de los mtodos de insercin se encuentran los mtodos
de insercin directa(*) e insercin binaria o dicotmica. Sobre los mtodos de
seleccin se encuentra el mtodo de seleccin directa y en los mtodos de
intercambio nos encontramos con los mtodos de la burbuja, la sacudida y el
quickSort(*). Despus de muchos aos escuchando a gente, solo se acuerdan del
mtodo de la burbuja (supongo que lo recordaran por su nombre peculiar) pero hay
que decir que de todos los mtodos citados es el peor mtodo que hay con
diferencia para ordenar arrays. Los mtodo marcados con (*) son los ms
recomendables para la ordenacin de arrays; insercin directa y quickSort.

Pasando a lo que nos interesa, en java nos encontramos con el mtodo


Sort de la clase Array que nos ordena un array de menor a mayor. No lo se
seguro, pero por el nombre tiene pinta que lo hace con el mtodo quickSort.
Vamos a poner un ejemplo de como llamar a este mtodo:

// Array a ordenar:

int[] intArray = { 3, 2, 8, 5, 7, 9 };

// Mtodo "sort" para ordenar el array

Arrays.sort(intArray);

Si ejecutis un programa con este cdigo en java e imprimis el array


despus de ejecutar este mtodo, comprobareis que os da el array ordenado de
menor a mayor.

Como veis es muy sencillo de ordenar un array de cualquier tipo de datos


de menor a mayor, pero: Y si lo quiero ordenar de mayor a menor? Si quiero
saber los indices del array tras la ordenacin?, es decir como resuelvo el siguiente
problema:

...Array desordenado de enteros ...

Indices: 0 1 2 3 4 5
Array: 3 2 8 5 7 9

...Array Ordenado decrecientemente con sus indices ...

Indices: 5 2 4 3 0 1
Array: 9 8 7 5 3 2

Bueno, tranquilos que no es el fin del mundo ;). Para los experimentos que
suelo hacer, necesito muchas veces obtener, dado un array, su array ordenado
junto con sus indices. He encontrado muchas soluciones por web como
StackOverflow, pero al final ninguna me convence y decidi hacer una API que
resuelva estos problemas para los arrays de enteros, floats, doubles y Strings.
Este API la he llamado SortArray y la podeis descargar en el enlace que os he
puesto arriba. El .jar se llama SortArray_1.0.jar. Con esta API podeis ordenar
arrays de los tipos de datos citados anteriormente y lo podeis hacer de mayor a
menor o de menor a mayor, pudiendo obtener los indices de los arrays tras la
ordenacin. A continuacin paso a poner ejemplos de la utilizacin del API que son
los mismo que podeis encontrar en el proyecto.

Dado un Array de nmeros enteros intArray lo quiero ordenar de menor a


mayor y de mayor a menor, sabiendo los indices. Para ello me creo un objeto de la
clase SortArray y llamo a los mtodos de ordenacin, pidiendo despus los array
correspondientes con los metodos get:

// Array a ordenar:

int[] intArray = { 3, 2, 8, 5, 7, 9 };

int[] intArray2 = Arrays.copyOf(intArray, intArray.length); // Hago una copia


del array para ordenarlo de mayor a menor

// Ordenamos el array de menor a mayor

SortArrays sortArrays = new SortArrays(intArray); // Nos creamos un objeto d


e la clase SortArray

sortArrays = sortArrays.increasingOrderInt(); // Llamamos al mtodo que


ordena el array y sus indices de menor a mayor

int [] indices = sortArrays.getIndexArray(); // Obtengo los indices de


array tras ordenarlo

int [] arrayOrdenado = sortArrays.getIntArray(); // Obtengo el array de ent


eros ordenado

// Ordenamos el array de mayor a menor

sortArrays = new SortArrays(intArray2); // Nos creamos el objeto de


la clase SortArray

sortArrays = sortArrays.decreasingOrderInt(); // Llamamos al mtodo que o


rdena el array de mayor a menor

int indices [] = sortArrays.getIndexArray(); // Obtengo los indices del


array tras ordenarlos

int [] arrayOrdenado = sortArrays.getIntArray(); // Obtengo el array de ente


ros ordenado

Este cdigo como tal no funciona, porque es un pseudocdigo. En el


proyecto que os podeis descargar esta bien escrito. Aqui lo he escrito as para que
se entienda y se pueda leer bien. Si ejecutis el proyecto vereis que os devuelve
los arrays ordenados con sus respectivos indices. Si imprimis por pantalla estos
arrays os saldr lo siguiente:

...Array desordenado de enteros ...

Indices: 0 1 2 3 4 5
Array: 3 2 8 5 7 9

...Array Ordenado crecientemente con sus indices utilizando el API ...

Indices: 1 0 3 4 2 5
Array: 2 3 5 7 8 9

...Array desordenado de enteros ...

Indices: 0 1 2 3 4 5

Array: 3 2 8 5 7 9
...Array Ordenado decrecientemente con sus indices utilizando el API ...

Indices: 5 2 4 3 0 1
Array: 9 8 7 5 3 2

En este caso se ha mostrado como ordenar array de tipo entero. Para


ordenar los arrays de los otros tipos teneis que llamar a los siguientes mtodos
que podeis ver en el JavaDoc que os podeis descargar del enlace de arriba:

// ORDENAR ARRAY DE FLOATS DE MENOR A MAYOR

SortArrays sortArrays = new SortArrays(floatArray); // Creamos el objet


o pasandole el array al constructor

sortArrays = sortArrays.increasingOrderFloat(); // Llamamos al mto


do para que ordene el array de menor a mayor

int [] indices = sortArrays.getIndexArray(); // Obtenemos los in


dices del array ordenado

float [] arrayOrdenado = sortArrays.getFloatArray(); // Obtenemos el arr


ay ordenado de floats de menor a mayor

// ORDENAR ARRAY DE FLOATS DE MAYOR A MENOR

SortArrays sortArrays = new SortArrays(floatArray); // Creamos el objet


o pasandole el array al constructor

sortArrays = sortArrays.decreasingOrderFloat(); // Llamamos al mto


do para que ordene el array de mayor a menor
int [] indices = sortArrays.getIndexArray(); // Obtenemos los in
dices del array ordenado

float [] arrayOrdenado = sortArrays.getFloatArray(); // Obtenemos el arr


ay ordenado de floats de menor a mayor

// ORDENAR ARRAY DE DOUBLES DE MENOR A MAYOR

SortArrays sortArrays = new SortArrays(doubleArray); // Creamos el objet


o pasandole el array al constructor

sortArrays = sortArrays.increasingOrderDouble(); // Llamamos al mtodo para


que ordene el array de menor a mayor

int [] indices = sortArrays.getIndexArray(); // Obtenemos los in


dices del array ordenado

double [] arrayOrdenado = sortArrays.getDoubleArray(); // Obtenemos el arr


ay ordenado de doubles de menor a mayor

// ORDENAR ARRAY DE DOUBLES DE MAYOR A MENOR

SortArrays sortArrays = new SortArrays(doubleArray); // Creamos el objet


o pasandole el array al constructor

sortArrays = sortArrays.decreasingOrderDouble(); // Llamamos al mtodo para


que ordene el array de mayor a menor

int [] indices = sortArrays.getIndexArray(); // Obtenemos los in


dices del array ordenado

double [] arrayOrdenado = sortArrays.getDoubleArray(); // Obtenemos el arr


ay ordenado de doubles de mayor a menor

// ORDENAR ARRAY DE STRINGS DE MENOR A MAYOR

SortArrays sortArrays = new SortArrays(stringArray); // Creamos el objet


o pasandole el array al constructor

sortArrays = sortArrays.increasingOrderString(); // Llamamos al mtodo para


que ordene el array de menor a mayor

int [] indices = sortArrays.getIndexArray(); // Obtenemos los in


dices del array ordenado

String [] arrayOrdenado = sortArrays.getStringArray(); // Obtenemos el arr


ay ordenado de strings de menor a mayor

// ORDENAR ARRAY DE STRINGS DE MAYOR A MENOR


SortArrays sortArrays = new SortArrays(stringArray); // Creamos el objet
o pasandole el array al constructor

sortArrays = sortArrays.decreasingOrderString(); // Llamamos al mtodo para


que ordene el array de mayor a menor

int [] indices = sortArrays.getIndexArray(); // Obtenemos los in


dices del array ordenado

String [] arrayOrdenado = sortArrays.getStringArray(); // Obtenemos el arr


ay ordenado de strings de mayor a menor

Con estos objetos y mtodos, si queremos ordenar los siguiente arrays:

float[] floatArray = { 3.3f, 2.2f, 8.8f, 5.5f, 7.7f, 9.9f };

double[] doubleArray = { 3.33333, 2.22222, 8.88888, 5.55555, 7.77777, 9.99999


};

String[] stringArray = { "Espaa", "Francia", "Italia", "Alemania", "Holand


a" };

Vamos a tener como salida lo siguiente (esto es lo que tenis ejecutando el


proyecto que os hemos compartido):

...Array desordenado de floats ...

Indices: 0 1 2 3 4 5
Array: 3.3 2.2 8.8 5.5 7.7 9.9

...Array Ordenado crecientemente con sus indices utilizando el API ...


Indices: 1 0 3 4 2 5

Array: 2.2 3.3 5.5 7.7 8.8 9.9

...Array desordenado de floats ...

Indices: 0 1 2 3 4 5
Array: 3.3 2.2 8.8 5.5 7.7 9.9

...Array Ordenado decrecientemente con sus indices utilizando el API ...

Indices: 5 2 4 3 0 1
Array: 9.9 8.8 7.7 5.5 3.3 2.2

...Array desordenado de doubles ...


Indices: 0 1 2 3 4 5
Array: 3.33333 2.22222 8. 88888 5.55555 7.77777 9.99999

...Array Ordenado crecientemente con sus indices utilizando el API ...

Indices: 1 0 3 4 2 5

Array: 2.22222 3.33333 5.55555 7.77777 8.88888 9.99999

...Array desordenado de doubles ...


Indices: 0 1 2 3 4 5

Array: 3.33333 2.22222 8.88888 5.55555 7.77777 9.99999

...Array Ordenado decrecientemente con sus indices utilizando el API ...


Indices: 5 2 4 3 0 1

Array: 9.99999 8.88888 7.77777 5.55555 3.33333 2.22222

...Array desordenado de Strings ...

Indices: 0 1 2 3 4
Array: Espaa Francia Italia Alemania Holanda

...Array Ordenado crecientemente con sus indices utilizando el API ...

Indices: 3 0 1 4 2
Array: Alemania Espaa Francia Holanda Italia

...Array desordenado de S trings ...

Indices: 0 1 2 3 4

Array: Espaa Francia Italia Alemania Holanda


...Array Ordenado decrecientemente con sus indices utilizando el API ...

Indices: 2 4 1 0 3
Array: Italia Holanda Francia Espaa Alemania

Una vez explicado el funcionamiento del API y que podeis descargar sin
problema, pasamos a explicar como hemos hecho los mtodos de ordenacin de
arrays e indices. Lo vamos a explicar para el caso de ordenar array de enteros,
pero cambiando el tipo de variables, se hara lo mismo con cualquier otro tipo de
datos.

Lo primero que hacemos es hacer una copia del array que queremos
ordenar, para poder posteriormente compararlos y obtener los indices ordenados
del array. La copia de arrays se hace de la siguiente forma:

int[] intArray = { 3, 2, 8, 5, 7, 9 }; // Array


original
int[] intArrayCopia = Arrays.copyOf(intArray, intArray.length); // Copia
del array

MUCHISIMO CUIDADO!!!! a la hora de hacer la copia. Mucho confunden


hacer una copia con copiar la referencia. Si hacis lo siguiente
intArray=intArrayCopia estais haciendo una copia de la referencia del array. Esto
es un poco largo de explicar pero hacer la copia bien que en eso falla mucho la
gente.

Una vez que se ha hecho la copia del array, ordenamos el primer array de
menor a mayor con el mtodo Sort de la clase Arrays, tal y como mostramos al
inicio del tutorial:

// Order the Array in increasing order

Arrays.sort(intArray);

En este caso tenemos dos array, el ordenado de menor a mayor y el


desordenado. Si queremos que el array este ordenado de mayor a menor, hemos
creado el siguiente mtodo que nos cambia el orden del array:

public int[] invertIntArray(int[] array) {

int i = 0;

int j = array.length - 1;

int tmp;

while (j > i) {

tmp = array[j];

array[j] = array[i];

array[i] = tmp;

j--;

i++;

return array;

}
Este mtodo solo se utilizara si queremos ordenar el array de mayor a
menor.

Ahora solo queda ver los indices de los array, por eso hemos hecho una
copia del array original, para compararlos y obtener sus indices. El siguiente
mtodo obtiene el orden de los indices pasndole como parmetros al array
desordenado y el ordenado:

private int[] orderIntIndex(int[] disorderArray, int[] orderArray) {

int lon = disorderArray.length;

int[] index = new int[lon];

Arrays.fill(index, 0);

boolean[] esta = new boolean[lon];

Arrays.fill(esta, false);

for (int i = 0; i < orderArray.length; i++) {

int in = 0;

boolean stay = false;

while (in < orderArray.length & !stay) {

if ((disorderArray[in] == orderArray[i]) & !esta[in]


) {

esta[in] = true;

index[i] = in;

stay = true;

} else {

in++;

return index;
}

Con estos mtodos es como se ha hecho el API, cambiando evidentemente


los tipos de datos para cada caso. Esto ha sido todo. El API esta hecho por
nosotros y lo podeis descargar y compartir libremente. Cualquier comentario o
duda sobre el API, dejarnos un comentario en la entrada ;).

ArrayList en Java, con ejemplos

La clase ArrayList en Java, es una clase que permite almacenar datos en


memoria de forma similar a los Arrays, con la ventaja de que el numero de
elementos que almacena, lo hace de forma dinmica, es decir, que no es
necesario declarar su tamao como pasa con los Arrays. Para todos aquellos que
hayis estudiado en alguna asignatura las estructuras de datos de las Pilas, Colas,
Listas, Arboles (AVL, B, B+, B*) etc. hay decir que los ArrayList tiran por tierra
toda la teoria que hay detrs de esas estructuras de datos ya que los ArrayList nos
permiten aadir, eliminar y modificar elementos (que pueden ser objetos o
elementos atmicos) de forma trasparente para el programador. Antes de pasar a
explicar el manejo de los ArrayList, dejamos un enlace al JavaDoc,
pulsando AQUI.

Antes de todo, decir que el cdigo de todos los ejemplos que se ponen a
continuacin los podeis descargar pulsando AQUI.

Los principales mtodos para trabajar con los ArrayList son los siguientes:

// Declaracin de un ArrayList de "String". Puede ser de cualquier otro Eleme


nto u Objeto (float, Boolean, Object, ...)

ArrayList<String> nombreArrayList = new ArrayList<String>();

// Aade el elemento al ArrayList

nombreArrayList.add("Elemento");

// Aade el elemento al ArrayList en la posicin 'n'

nombreArrayList.add(n, "Elemento 2");

// Devuelve el numero de elementos del ArrayList

nombreArrayList.size();

// Devuelve el elemento que esta en la posicin '2' del ArrayList


nombreArrayList.get(2);

// Comprueba se existe del elemento ('Elemento') que se le pasa como parametr


o

nombreArrayList.contains("Elemento");

// Devuelve la posicin de la primera ocurrencia ('Elemento') en el ArrayList

nombreArrayList.indexOf("Elemento");

// Devuelve la posicin de la ltima ocurrencia ('Elemento') en el ArrayList

nombreArrayList.lastIndexOf("Elemento");

// Borra el elemento de la posicin '5' del ArrayList

nombreArrayList.remove(5);

// Borra la primera ocurrencia del 'Elemento' que se le pasa como parametro.

nombreArrayList.remove("Elemento");

//Borra todos los elementos de ArrayList

nombreArrayList.clear();

// Devuelve True si el ArrayList esta vacio. Sino Devuelve False

nombreArrayList.isEmpty();

// Copiar un ArrayList

ArrayList arrayListCopia = (ArrayList) nombreArrayList.clone();

// Pasa el ArrayList a un Array

Object[] array = nombreArrayList.toArray();

Otra cosa muy importante a la hora de trabajar con los ArrayList son los
Iteradores (Iterator). Los Iteradores sirven para recorrer los ArrayList y poder
trabajar con ellos. Los Iteradores solo tienen tres mtodos que son
el hasNext() para comprobar que siguen quedando elementos en el iterador,
el next() para que nos de el siguiente elemento del iterador; y el remove() que
sirve para eliminar el elemento del Iterador.

Bueno, si esto no te ha quedado muy claro, pasamos a poner el primer


ejemplo. En el siguiente fragmento de cdigo, declaramos un ArrayList de Strings y
lo rellenamos con 10 Strings (Elemento i). Esto lo hacemos con el mtodo add().
Despus aadimos un nuevo elemento al ArrayList en la posicin 2 (con el
metodo add(posicin,elem ento)) que le llamaremos Elemento 3 y
posteriormente imprimiremos el contenido del ArrayList, recorriendolo con un
Iterador. El fragmento de este cdigo es el siguiente:
// Declaracin el ArrayList

ArrayList<String> nombreArrayList = new ArrayList<String>();

// Aadimos 10 Elementos en el ArrayList

for (int i=1; i<=10; i++){

nombreArrayList.add("Elemento "+i);

// Aadimos un nuevo elemento al ArrayList en la posicin 2

nombreArrayList.add(2, "Elemento 3");

// Declaramos el Iterador e imprimimos los Elementos del ArrayList

Iterator<String> nombreIterator = nombreArrayList.iterator();

while(nombreIterator.hasNext()){

String elemento = nombreIterator.next();

System.out.print(elemento+" / ");

Ejecutando esta cdigo obtenemos por pantalla lo siguiente:

Elemento 1 / Elemento 2 / Elemento 3 / Elemento 3 / Elemento 4 / Elemento 5 /


Elemento 6 / Elemento 7 / Elemento 8 / Elemento 9 / Elemento 10 /

Como se observa en el resultado tenemos repetido el elemento Elemento


3 dos veces y esto lo hemos puesto a proposito para mostrar el siguiente ejemplo.
Ahora para seguir trabajando con los ArrayList, lo que vamos ha hacer es mostrar
el numero de elementos que tiene el ArrayList y despus eliminaremos el primer
elemento del ArrayList y los elementos del ArrayList que sean iguales a Elemento
3, que por eso lo hemos puesto repetido. El Elemento 3 lo eliminaremos con el
metodo remove() del iterador. A continuacin mostramos el cdigo que realiza lo
descrito:

// Recordar que previamente ya hemos declarado el ArrayList y el Iterator de


la siguiente forma:
// ArrayList<String> nombreArrayList = new ArrayList<String>();

// Iterator<String> nombreIterator = nombreArrayList.iterator();

// Obtenemos el numero de elementos del ArrayList

int numElementos = nombreArrayList.size();

System.out.println("nnEl ArrayList tiene "+numElementos+" elementos");

// Eliminamos el primer elemento del ArrayList, es decir el que ocupa la posi


cin '0'

System.out.println("n... Eliminamos el primer elemento del ArrayList ("+nombr


eArrayList.get(0)+")...");

nombreArrayList.remove(0);

// Eliminamos los elementos de ArrayList que sean iguales a "Elemento 3"

System.out.println("n... Eliminamos los elementos de ArrayList que sean igual


es a "Elemento 3" ...");

nombreIterator = nombreArrayList.iterator();

while(nombreIterator.hasNext()){

String elemento = nombreIterator.next();

if(elemento.equals("Elemento 3"))

nombreIterator.remove(); // Eliminamos el Elemento que hemos


obtenido del Iterator

// Imprimimos el ArrayList despues de eliminar los elementos iguales a "Eleme


nto 3"

System.out.println("nImprimimos los elementos del ArrayList tras realizar las


eliminaciones: ");

nombreIterator = nombreArrayList.iterator();

while(nombreIterator.hasNext()){

String elemento = nombreIterator.next();

System.out.print(elemento+" / ");
}

// Mostramos el numero de elementos que tiene el ArrayList tras las eliminaci


ones:

numElementos = nombreArrayList.size();

System.out.println("nNumero de elementos del ArrayList tras las eliminaciones


= "+numElementos);

Como salida a este cdigo tenemos lo siguiente:

El ArrayList tiene 11 elementos

... Eliminamos el primer elemento del ArrayList (Elemento 1)...

... Eliminamos los elementos de ArrayList que sean iguales a "Elemento 3" ...

Imprimimos los elementos del ArrayList tras realizar las eliminaciones:

Elemento 2 / Elemento 4 / Elemento 5 / Elemento 6 / Elemento 7 / Elemento 8 /


Elemento 9 / Elemento 10 /

Numero de elementos del ArrayList tras las eliminaciones = 8

Si os fijais, hemos eliminado 3 elementos del ArrayList de dos formas


distintas, preguntando por la posicin que ocupa un elemento en el ArrayList y
preguntando por el contenido de algn elemento del ArrayList. Como se observa
es muy importante saber manejar los Iteradores ya que con ellos podemos tratar
los elementos del ArrayList.

Bueno todo lo que hemos visto esta muy bien, pero por lo general los
ArrayList se suelen utilizar con objetos ms que con estructuras atmicas de datos,
ya que los ArrayList en Java son estructuras muy potentes y sencillas de manejar.

Ahora vamos a poner un ejemplo de la utilizacin de ArrayList con Objetos.


Para ello nos vamos ha crear una clase llamada PartidoFutbol que utilizaremos
para crearnos objetos de esa clase que almacenaremos en el ArrayList. En primer
lugar mostramos la clase PartidoFutbol que es la siguiente:

package ArrayList_Objetos;
public class PartidoFutbol {

private String equipoLocal;

private String equipoVisitante;

private int golesLocal;

private int golesVisitante;

public String getEquipoLocal() {

return equipoLocal;

public void setEquipoLocal(String equipoLocal) {

this.equipoLocal = equipoLocal;

public String getEquipoVisitante() {

return equipoVisitante;

public void setEquipoVisitante(String equipoVisitante) {

this.equipoVisitante = equipoVisitante;

public int getGolesLocal() {

return golesLocal;

public void setGolesLocal(int golesLocal) {


this.golesLocal = golesLocal;

public int getGolesVisitante() {

return golesVisitante;

public void setGolesVisitante(int golesVisitante) {

this.golesVisitante = golesVisitante;

Lo que vamos ha hacer ahora en este ejemplo, es leer desde un fichero de


texto, una serie de partidos de ftbol que guardaremos en un ArrayList de objetos
PartidoFutbol. Al utilizar el ArrayList, nos da igual el numero de partidos de ftbol
que haya en el fichero de texto ya que los ArrayList como vimos al principio son
dinmicos. Para este caso os adelante que hay 50 partidos de ftbol en el fichero,
pero nos daria igual cuantos podra haber.

A continuacin se muestra el cdigo de la lectura de los partidos de ftbol y


como los almacenamos en un ArrayList. Por curiosidad, un partido de ftbol esta
guardado en el fichero con la siguiente
estructura: equipoLocal::equipoVisitante::golesLocal::golesVisitante

// Nos creamos un ArrayList de objetos de la Clase "PartidoFutbol"

System.out.println("... Nos creamos un ArrayList de objetos de la Clase " Part


idoFutbol" ...");

ArrayList<PartidoFutbol> partidos = new ArrayList<PartidoFutbol>();

// Instanciamos el fichero donde estan los datos

File fichero = new File(nombreFichero);

Scanner s = null;

try {
// Leemos el contenido del fichero

System.out.println("... Leemos el contenido del fichero ...");

s = new Scanner(fichero);

// Obtengo los datos de los partidos de ftbol del fichero

while (s.hasNextLine()){

String linea = s.nextLine(); // Obtengo una linea del fi


chero (un partido de ftbol)

String [] cortarString = linea.split("::"); //


Obtengo los datos del partido de futbol

PartidoFutbol partido = new PartidoFutbol(); // Creo un


objeto de la clase "PartidoFutbol"

// Pongo los atributos al objeto "partido"

partido.setEquipoLocal(cortarString[0]);

partido.setEquipoVisitante(cortarString[1]);

partido.setGolesLocal(Integer.parseInt(cortarString[2]));

partido.setGolesVisitante(Integer.parseInt(cortarString[3]))
;

// Aadimos el objeto "partido" al ArrayList

partidos.add(partido);

} catch (Exception e) {

e.printStackTrace();

} finally{

try {

if (s != null)

s.close();

} catch (Exception e2) {

e2.printStackTrace();
}

System.out.println("... Guardados "+partidos.size()+" partidos de ftbol ...


");

Con este cdigo que mostramos tambien se puede ver de que forma se

puede leer un fichero de texto y tratar los datos . Una vez ejecutado este
cdigo tenemos guardado en el ArrayList partidos, 50 partidos de ftbol. Ahora
recorremos el ArrayList con un Iterator y mostramos por pantalla todos los
resultados de ftbol. Esto lo hacemos igual que antes, con el Iterator:

System.out.println("n... Resultados de los partidos de Futbol ...");

Iterator<PartidoFutbol> itrPartidos = partidos.iterator();

while(itrPartidos.hasNext()){

PartidoFutbol partido = itrPartidos.next();

System.out.println(partido.getEquipoLocal() + " "

+ partido.getGolesLocal() + "-"

+ partido.getGolesVisitante() + " "

+ partido.getEquipoVisitante());

Como salida a la ejecucin de este cdigo tenemos lo siguiente:

... Resultados de los partidos de Futbol ...

Valencia 1-0 Betis

Betis 1-0 Osasuna

Atletico Madrid 0-0 Zaragoza


Zaragoza 2-2 Valencia

Mallorca 0-1 Deportivo


Deportivo 1-0 Atletico Madrid

.
.

Mallorca 1-4 Malaga

Malaga 0-2 Atletico Madrid

Ahora vamos a eliminar del ArrayList, todos los partidos que no tengan
como resultado un empate. De esta forma trabajaremos de nuevo con el iterator.
Esto lo hacemos de la siguiente forma:

// Eliminamos los partidos de futbol del ArrayList, cuyo resultado

// no sea un empate

System.out.println("n... Tamao del ArrayList antes de eliminar partidos de f


utbol = "+partidos.size()+" ...");

System.out.println("n... Eliminamos los partidos de futbol cuyo resultado no


sea un empate ...");

itrPartidos = partidos.iterator();

while(itrPartidos.hasNext()){

PartidoFutbol partido = itrPartidos.next();

// Si los goles no son iguale, eliminamos el partido

if(partido.getGolesLocal() != partido.getGolesVisitante())

itrPartidos.remove();

// Imprimimos los elementos del ArrayList

System.out.println("n... Tamao del ArrayList despues de eliminar partidos de


futbol = "+partidos.size()+" ...");

System.out.println("n... Resultados de los partidos de Futbol con empate ..."


);

itrPartidos = partidos.iterator();

while(itrPartidos.hasNext()){

PartidoFutbol partido = itrPartidos.next();

System.out.println(partido.getEquipoLocal() + " "

+ partido.getGolesLocal() + "-"

+ partido.getGolesVisitante() + " "


+ partido.getEquipoVisitante());

Como resultado al ejecutar este cdigo tenemos lo siguiente, que como se


observa el ArrayList solo se ha quedado con los partidos de ftbol en los que ha
habido un empate:

... Tamao del ArrayList antes de eliminar partidos de futbol = 50 ...

... Eliminamos los partidos de futbol cuyo resultado no sea un empate ...

... Tamao del ArrayList despues de eliminar partidos de futbol = 16 ...

... Resultados de los partidos de Futbol con empate ...

Atletico Madrid 0-0 Zaragoza


Zaragoza 2-2 Valencia

Alaves 0-0 Barcelona

Getafe 1-1 Athletic


Villarreal 1-1 Sevilla

Betis 0-0 Zaragoza

Valencia 2-2 Deportivo


Deportivo 1-1 Betis

Barcelona 2-2 Valencia


Getafe 1-1 Mallorca

Malaga 0-0 Alaves

Cadiz 1-1 Villarreal


Sevilla 0-0 Cadiz

Zaragoza 1-1 Deportivo


Barcelona 2-2 Zaragoza

Real Sociedad 1-1 Betis

Con esto ya hemos visto como manejar los ArrayList y hemos visto los
mtodos mas importantes para ello. Con todo esto ya esta casi todo contado sobre
los ArrayList en Java. Ahora solo queda coger soltura y trabajar con ello.

Por ltimo vamos a rizar el rizo y vamos a poner un ejemplo de como


trabajar con ArrayList de ArrayList. Para ello vamos ha hacer un ejemplo que en
principio puede parecer complejo pero que en realizar no lo es, solo es un poco
lioso y hay que ir con cuidado. INTENTA HACER POR TU CUENTA ESTE
EJERCICIO ANTES DE MIRARLO, PORQUE SI LO CONSIGUES HACER, NO

HABRA TRABAJO CON ARRAYLIST QUE SE TE RESISTA

El ejercicio es el siguiente. Dado un fichero con una serie de nmeros, hay


que eliminar todos los ceros que hay en el fichero, y si una linea esta llena de
ceros, hay que eliminar la linea. En este caso tenemos en el fichero el contenido
siguiente:

1 2 0 3 0 7

0 0 0 0
0 6 9 8 0 9 6

0 0 0 0 7 9 0 0

0 0 0 0 0
8 7 0 8 9 0 8

Y lo que hay que conseguir es trasformar esos datos en los siguientes:

1 2 3 7

6 9 8 9 6

7 9

8 7 8 9 8

Es decir se eliminan todos los ceros y como las filas 2 y 5 contienen todo
ceros, se han de eliminar esas filas. Para ello nos tenemos que declarar un
ArrayList de ArrayList de enteros de la siguiente forma:

ArrayList<ArrayList<Integer>> arrayListNumeros = new ArrayList<ArrayList<Inte


ger>>();

Lo siguiente que haremos sera leer los nmeros del fichero y nos
crearemos por cada fila un ArrayList de enteros en el que guardaremos cada
nmero en una posicin del ArrayList y luego guardaremos ese ArrayList en el
ArrayList que hemos llamado arrayListNumeros. Esto lo hacemos de la siguiente
forma:

// Instanciamos el fichero donde estan los datos

File fichero = new File(nombreFichero);


Scanner s = null;

try {

// Leemos el contenido del fichero

System.out.println("... Leemos el contenido del fichero ...");

s = new Scanner(fichero);

// Obtengo los datos de los partidos de ftbol del fichero

while (s.hasNextLine()){

String linea = s.nextLine(); // Obtengo una linea del fi


chero con los numeros

String [] cortarString = linea.split(" "); //


Obtengo los numeros de la linea en un array

ArrayList<Integer> numeros = new ArrayList<Integer>();

// Pongo los numeros de la fila en el ArrayList

for (int i=0; i<cortarString.length; i++){

numeros.add(Integer.parseInt(cortarString[i]));

// Aado el ArrayList de enteros al ArratList de ArrayList

arrayListNumeros.add(numeros);

} catch (Exception e) {

e.printStackTrace();

} finally{

try {

if (s != null)

s.close();

} catch (Exception e2) {

e2.printStackTrace();

}
}

Para comprobar que hemos copiado bien los datos y para recorrer el
ArrayList de ArrayList de Enteros, vamos a imprimir por pantalla el contenido del
ArrayList y lo hacemos de la siguiente forma:

// Para ver que hemos leido bien los numeros del fichero, recorremos el Array
List de

// ArrayList y lo mostramos por pantalla.

System.out.println("n... Contenido de los ArrayList del ArrayList ..." );

Iterator<ArrayList<Integer>> itrArrayListNumeros = arrayListNumeros.iterator(


);

while(itrArrayListNumeros.hasNext()){

ArrayList<Integer> numeros = itrArrayListNumeros.next();

Iterator<Integer> itrNumeros = numeros.iterator();

while(itrNumeros.hasNext()){

int numero = itrNumeros.next();

System.out.print(numero+" ");

System.out.println();

Como salida tenemos el contenido del fichero.


Ahora lo que vamos ha hacer es recorrer el ArrayList de ArrayList de Enteros, y
eliminaremos de los ArrayList, todos los elementos que tengan como contenido 0.
Esto lo hacemos de la siguiente forma:

// Recorremos los ArrayList que hay en el ArrayList y eliminamos los numeros


que son cero

itrArrayListNumeros = arrayListNumeros.iterator();

while(itrArrayListNumeros.hasNext()){

ArrayList<Integer> numeros = itrArrayListNumeros.next();

Iterator<Integer> itrNumeros = numeros.iterator();


while(itrNumeros.hasNext()){

int numero = itrNumeros.next();

if (numero == 0)

itrNumeros.remove();

Ahora borramos del ArrayList, los ArrayLit que estn vacos, preguntando
con el mtodo isEmpty(). Esto lo hacemos de la siguiente forma:

// Recorremos el ArrayList de los ArrayList y eliminamos los ArrayList que no

// contengan elementos

itrArrayListNumeros = arrayListNumeros.iterator();

while(itrArrayListNumeros.hasNext()){

ArrayList<Integer> numeros = itrArrayListNumeros.next();

// Si el ArrayList esta vacio, lo eliminamos del ArrayList

if (numeros.isEmpty())

itrArrayListNumeros.remove();

Con todo esto ya hemos eliminado los ceros, y los ArrayList que estaban
vacos. Ahora solo queda recorrer de nuevo el ArrayList de ArrayList y mostrar el
contenido tras realizar las eliminaciones de ceros. Esto lo hacemos de la siguiente
manera:

// Mostramos el ArrayList tras eliminar todos los ceros

String salida = "";

System.out.println("n... Salida sin ceros ...");

itrArrayListNumeros = arrayListNumeros.iterator();

while(itrArrayListNumeros.hasNext()){

ArrayList<Integer> numeros = itrArrayListNumeros.next();


Iterator<Integer> itrNumeros = numeros.iterator();

while(itrNumeros.hasNext()){

int numero = itrNumeros.next();

salida += numero+" ";

salida += "n";

System.out.println(salida);

Tras ejecutar este cdigo, vemos que tenemos la salida esperada, que es
la siguiente:

1 2 3 7

6 9 8 9 6
7 9

8 7 8 9 8

Con todo esto ya hemos visto prcticamente todo sobre los ArrayList, con
ejemplo de como tratarlos con elementos atmicos (String, int, float, double, ) y
con objetos y sobre todo ver como se trabaja con ArrayList de ArrayList que como
se ha visto la complejidad esta en saber recorrer esa estructura de datos.

El cdigo de todos estos ejemplos (junto con los ficheros correspondientes)


los podeis descargar desde

Herencia en Java, con ejemplos

El proyecto de este post lo puedes descargar pulsando AQUI.

La Herencia es uno de los 4 pilares de la programacin orientada a objetos


(POO) junto con la Abstraccin, Encapsulacin y Polimorfismo. Al principio
cuesta un poco entender estos conceptos caractersticos del paradigma de la POO
porque solemos venir de otro paradigma de programacin como el paradigma de la
programacin estructurada (ver la entrada"Paradigmas de Programacin), pero se
ha de decir que la complejidad est en entender este nuevo paradigma y no en
otra cosa. En esta entrada vamos a explicar de la mejor manera posible que es la
herencia y lo vamos a explicar con un ejemplo.

Respecto a la herencia se han dado muchas definiciones como por ejemplo


la siguiente: "La herencia es un mecanismo que permite la definicin de una clase
a partir de la definicin de otra ya existente. La herencia permite compartir
automticamente mtodos y datos entre clases, subclases y objetos.". As de
primeras esta definicin es un poco difcil de digerir para aquellos que estis
empezando con la POO, as que vamos a intentar digerir esta definicin con un
ejemplo en el que veremos que la herencia no es ms que un "Copy-Paste
Dinmico" o una forma de "sacar factor comn" al cdigo que escribimos.

El ejemplo que proponemos es un caso en el que vamos a simular el


comportamiento que tendran los diferentes integrantes de la seleccin espaola
de futbol; tanto los Futbolistas como el cuerpo tcnico (Entrenadores, Masajistas,
etc). Para simular este comportamiento vamos a definir tres clases que van a
representaran a objetos Futbolista, Entrenador y Masajista. De cada unos de ellos
vamos a necesitar algunos datos que reflejaremos en los atributos y una serie de
acciones que reflejaremos en sus mtodos. Estos atributos y mtodos los
mostramos en el siguiente diagrama de clases:

NOTA: en este diagrama y en adelante no vamos a poner los constructores y


mtodos getter y setter con el fin de que el diagrama nos quede grande e
"intendible" aunque en un buen diagrama de clases deberan aparecer para
respetar el principio de encapsulacin de la POO

Como se puede observar, vemos que en las tres clases tenemos atributos y
mtodos que son iguales ya que los tres tienen los atributos id, Nombre, Apellidos
y Edad; y los tres tienen los mtodos de Viajar y Concentrarse:
A nivel de cdigo tenemos lo siguiente tras ver el diagrama de clases:

public class Futbolista public class Entrenador public class Masajista

{ { {

private int id; private int id; private int id;

private String private String private String N


Nombre; Nombre; ombre;

private String private String private String A


Apellidos; Apellidos; pellidos;

private int Eda private int Eda private int Edad


d; d; ;

private int dor private String private String T


sal; idFederacion; itulacion;

private String private int anio


demarcacion; sExperiencia;
// constructor,
getter y setter

// constructor, // constructor,
getter y setter getter y setter
public void Con
centrarse() {

public void Con ... public void Conc


centrarse() { entrarse() {
}
... ...

} public void Via }


jar() {

...
public void Via public void Viaj
jar() { } ar() {

... ...

} public void dir }


igirPartido() {

...
public void jug public void darM
arPartido() { } asaje() {

... ...

} public void dir }


igirEntreno() {
}
...
public void ent
renar() { }

... }

Lo que podemos ver en este punto es que estamos escribiendo mucho


cdigo repetido ya que las tres clases tienen mtodos y atributos comunes, de ahi
y como veremos enseguida, decimos que la herencia consiste en "sacar factor
comn" para no escribir cdigo de ms, por tanto lo que haremos sera crearnos
una clase con el "cdigo que es comn a las tres clases" (a esta clase se le
denomina en la herencia como "Clase Padre o SuperClase") y el cdigo que
es especifico de cada clase, lo dejaremos en ella, siendo denominadas estas
clases como "Clases Hijas", las cuales heredan de la clase padre todos los
atributos y mtodos pblicos o protegidos. Es muy importante decir que las
clases hijas no van a heredar nunca los atributos y mtodos privados de la
clase padre, as que mucho cuidado con esto. En resumen para que veis la
ventaja de la herencia, tenemos ahora una clase padre con 'n' lineas de cdigo y
tres clases hijas con 'a', 'b' y 'c' lineas de cdigos respectivamente, por tanto si
hechis cuentas, hemos reducido nuestro cdigo en '2n' lneas menos ya que
antes tenamos '(n+a)+(n+b)+(n+c)' lneas de cdigo y ahora tras aplicar
herencia tenemos 'n+a+b+c' lneas, aunque tambin es cierto que tenemos una
clase ms, pero veremos un poco ms adelante la ventaja de tener esa clase
padre. En resumen, al "sacar factor comn" y aplicar herencia, tenemos las
siguientes clases:
A nivel de cdigo, las clases quedaran implementadas de la siguiente
forma:

public class SeleccionFu


tbol

protected int i
d;

protected Strin
g Nombre;

protected Strin
g Apellidos;

protected int E
dad;
// constructor,
getter y setter

public void Con


centrarse() {

...

public void Via


jar() {

...

public class Futbolista public class Entrenador public class Masajista e


extends SeleccionFutbol extends SeleccionFutbol xtends SeleccionFutbol

{ { {

private int dor


sal;
private String private String T
private String idFederacion; itulacion;
demarcacion;
private int anio
sExperiencia;
public Entrenado
public Futbolist r() {
a() {
super() public Masajista
super() ; () {
;
} super();
}
}

// getter y set
// getter y set ter
ter // getter y sett
er

public void dir


public void jug igirPartido() {
arPartido() {
... public void darM
... asaje() {
}
} ...

}
public void dir
public void ent igirEntreno() { }
renar() {
...
...
}
}
}
}

Como podis observar ahora queda un cdigo mucho ms limpio,


estructurado y con menos lneas de cdigo, lo que lo hace ms legible, cosa
que es muy importante y lo que todava lo hace ms importante es que es un
cdigo reutilizable, lo que significa que ahora si queremos aadir ms clases a
nuestra aplicacin como por ejemplo una clase Mdico, Utiller@, Jefe/a de prensa
etc. que pertenezcan tambin al equipo tcnico de la seleccin Espaola, lo
podemos hacer de forma muy sencilla ya que en la clase padre (SeleccionFutbol)
tenemos implementado parte de sus datos y de su comportamiento y solo habr
que implementar los atributos y mtodos propios de esa clase. Empezis a ver la
utilidad de la herencia?.

Ahora si os habis fijado bien en el cdigo que se ha escrito y sino habis


tenido experiencia con la herencia en Java, habris podido observar dos palabras
reservadas "nuevas" como son "extends", "protected" y "super". Pues bien, ahora
vamos a explicar el significado de ellas:

extends: Esta palabra reservada, indica a la clase hija cual va a ser su


clase padre, es decir que por ejemplo en la clase Futbolista al poner "public
class Futbolista extends SeleccionFutbol" le estamos indicando a la clase
'Futbolista' que su clase padre es la clase 'SeleccionFutbol' o dicho de otra
manera para que se entienda mejor, al poner esto estamos haciendo un
"copy-paste dinmico" diciendo a la clase 'Futbolista' que se 'copie' todos
los atributos y mtodos pblicos o protegidos de la clase 'SeleccionFutbol'.
De aqu viene esa 'definicin' que dimos de que la herencia en un 'copy-
paste dinmico'.
protected: sirve para indicar un tipo de visibilidad de los atributos y
mtodos de la clase padre y significa que cuando un atributo es 'protected'
o protegido, solo es visible ese atributo o mtodo desde una de las clases
hijas y no desde otra clase.
super: sirve para llamar al constructor de la clase padre. Quizs en el
cdigo que hemos puesto no se ha visto muy bien, pero a continuacin lo
mostramos de formas ms clara, viendo el constructor de los objetos
pasndole los atributos:

public class SeleccionFutbol {

......

public SeleccionFutbol() {

public SeleccionFutbol(int id, String nombre, String apellidos, int e


dad) {

this.id = id;

this.Nombre = nombre;

this.Apellidos = apellidos;

this.Edad = edad;

......

public class Futbolista extends SeleccionFutbol {

......

public Futbolista() {

super();

public Futbolista(int id, String nombre, String apellidos, int edad,


int dorsal, String demarcacion) {

super(id, nombre, apellidos, edad);

this.dorsal = dorsal;

this.demarcacion = demarcacion;

......
Hasta aqu todo correcto, pero ahora vamos a ver como trabajamos con
estas clases. Para ver este funcionamiento de forma clara y sencilla vamos a
trabajar con un objeto de cada clase y vamos a ver como se crean y de que forma
ejecutan sus mtodo. Para ello empecemos mostrando el siguiente fragmento de
cdigo:

public class Main {

// ArrayList de objetos SeleccionFutbol. Idenpendientemente de la cla


se hija a la que pertenezca el objeto

public static ArrayList<SeleccionFutbol> integrantes = new ArrayList<


SeleccionFutbol>();

public static void main(String[] args) {

Entrenador delBosque = new Entrenador(1, "Vicente", "Del Bos


que", 60, "284EZ89");

Futbolista iniesta = new Futbolista(2, "Andres", "Iniesta",


29, 6, "Interior Derecho");

Masajista raulMartinez = new Masajista(3, "Ral", "Martinez"


, 41, "Licenciado en Fisioterapia" , 18);

integrantes.add(delBosque);

integrantes.add(iniesta);

integrantes.add(raulMartinez);

// CONCENTRACION

System.out.println("Todos los integrantes comienzan una conc


entracion. (Todos ejecutan el mismo mtodo)");

for (SeleccionFutbol integrante : integrantes) {

System.out.print(integrante.getNombre()+" "+integran
te.getApellidos()+" -> ");

integrante.Concentrarse();

}
// VIAJE

System.out.println("nTodos los integrantes viajan para jugar


un partido. (Todos ejecutan el mismo mtodo)");

for (SeleccionFutbol integrante : integrantes) {

System.out.print(integrante.getNombre()+" "+integran
te.getApellidos()+" -> ");

integrante.Viajar();

......

Lo primero que vemos es que nos creamos un objeto de cada clase,


pasndole los atributos al constructor como parmetro y despus
"sorprendentemente" los metemos en un "ArrayList" de objetos de la clase
"SeleccionFutbol" que es la clase padre. Esto evidentemente te lo permite hacer
ya que todos los objetos son hijos de la misma clase padre. Luego como veis,
recorremos el ArrayList y ejecutamos sus mtodos "comunes" como son el
'Concentrarse' y el 'Viajar'. Este cdigo da como salida lo siguiente:

Todos los integrantes comienzan una concentracion. (Todos ejecutan el mismo m


todo)

Vicente Del Bosque -> Concentrarse


Andres Iniesta -> Concentrarse

Ral Martinez -> Concentrarse

Todos los integrantes viajan para jugar un partido. (Todos ejecutan el mismo
mtodo)
Vicente Del Bosque -> Viajar

Andres Iniesta -> Viajar

Ral Martinez -> Viajar

Como veis al ejecutar todos el mismo mtodo de la clase padre el cdigo


puesto funciona correctamente.

Posteriormente vamos a ejecutar cdigo especifico de las clases hijas, de


ahi que ahora no podamos recorrer el ArrayList y ejecutar el mismo mtodo para
todos los objetos ya que ahora esos objetos son nicos de la clases hijas. El
cdigo es el siguiente:

// ENTRENAMIENTO
System.out.println("nEntrenamiento: Solamente el entrenador y el futbolista t
iene metodos para entrenar:" );

System.out.print(delBosque.getNombre()+" "+delBosque.getApellidos()+" -> ");

delBosque.dirigirEntrenamiento();

System.out.print(iniesta.getNombre()+" "+iniesta.getApellidos()+" -> ");

iniesta.entrenar();

// MASAJE

System.out.println("nMasaje: Solo el masajista tiene el mtodo para dar un ma


saje:");

System.out.print(raulMartinez.getNombre()+" "+raulMartinez.getApellidos()+" -
> ");

raulMartinez.darMasaje();

// PARTIDO DE FUTBOL

System.out.println("nPartido de Ftbol: Solamente el entrenador y el futbolis


ta tiene metodos para el partido de ftbol:");

System.out.print(delBosque.getNombre()+" "+delBosque.getApellidos()+" -> ");

delBosque.dirigirPartido();

System.out.print(iniesta.getNombre()+" "+iniesta.getApellidos()+" -> ");

iniesta.jugarPartido();

Como vemos aunque el entrenador y los futbolistas asistan a un


entrenamiento, los dos hacen una funcin diferente en el mismo, por tanto hay que
hacer mtodos diferente para cada una de las clases. Ya veremos cuando
hablemos del polimorfismo que podremos ejecutar el mismo mtodo para clases
diferentes y que esos mtodos hagan cosas distintas. Como resultado al cdigo
mostrado tenemos lo siguiente:

Entrenamiento: Solamente el entrenador y el futbolista tiene metodos para ent


renar:
Vicente Del Bosque -> Dirige un entrenamiento

Andres Iniesta -> Entrena

Masaje: Solo el masajista tiene el mtodo para dar un masaje:


Ral Martinez -> Da un masaje

Partido de Ftbol: Solamente el entrenador y el futbolista tiene metodos para


el partido de ftbol:
Vicente Del Bosque -> Dirige un partido

Andres Iniesta -> Juega un partido

CONCLUSIONES Y ACLARACIONES:
Esto ha sido todo lo que hemos contado sobre la herencia en esta entrada.
El tema de la herencia es un tema que puede ser un poco ms complejo de lo que
lo hemos contado aqu, ya que solo hemos contado lo que es la herencia simple
(ya que Java por el momento es el nico tipo de herencia que soporta) y no la
herencia mltiple, que es un tipo de herencia en la que una clase hija puede tener
varios padres, aunque por el momento si estis empezando a aprender el
concepto de la herencia, con la herencia simple tenis ms que suficiente. Para los
que os estis iniciando en el mundo de la ingeniera informtica, habris podido ver
que hemos puesto unos ejemplo mostrando unos diagramas "un poco raros"; pues
bien, estos diagramas se llaman diagramas de clases (que los hemos realizado
con la herramienta web de www.genmymodel.com) y sirven para representar de
forma grfica los atributos y mtodos de las clases y las relaciones entre ellos,
utilizando el lenguaje UML del cual intentaremos hablar ms adelante en otros
tutoriales. Por ltimo decir y aclarar que en esta entrada quizs no hemos utilizado
una terminologa correcta para explicar la herencia, pero lo hemos explicadode una
forma algo distinta a como esta explicada por ahi para que los que empeceis
podais entender la herencia desde otro punto de vista.

Polimorfismo en Java (Parte I),


con ejemplos

El proyecto de este post lo puedes descargar pulsando AQUI.

El Polimorfismo es uno de los 4 pilares de la programacin orientada a


objetos (POO) junto con la Abstraccin, Encapsulacin y Herencia. Para
entender que es el polimorfismo es muy importante que tengis bastante claro el
concepto de la Herencia, por tanto recomendamos que veis la entrada en la que
hablamos de la Herencia: Herencia en Java, con ejemplos.

Para empezar con esta entrada, se ha de decir que el


trmino "Polimorfismo" es una palabra de origen griego que
significa "muchas formas". Este termino se utiliza en la POO para "referirse a la
propiedad por la que es posible enviar mensajes sintcticamente iguales
a objetos de tipos distintos". Como esta definicin quizs sea algo difcil de
entender, vamos a explicarla con el ejemplo que pusimos en la entrada de
la herencia en la que queramos simular el comportamiento que tendran los
diferentes integrantes de la seleccin espaola de ftbol; tanto los Futbolistas
como el cuerpo tcnico (Entrenadores, Masajistas, etc). Para este ejemplo nos
vamos a basar en el siguiente diagrama de clases:

NOTA: en este diagrama y en adelante no vamos a poner los constructores y


mtodos getter y setter con el fin de que el diagrama nos quede grande e
intendible aunque en un buen diagrama de clases deberan aparecer para
respetar el principio de encapsulacin de la POO

En este ejemplo vamos a tener una clase padre (SeleccinFutbol) en la que


tendremos los atributos y mtodos comunes a todos los integrantes que
forman la seleccin espaola de ftbol (Futbolistas, Entrenadores,
Masajistas, etc.) y en ella se van a implementar los mtodos del
comportamiento "genrico" que deben de tener todos los integrantes de la
seleccin. Como ya dijimos en la entrada de la herencia, la herencia no es ms
que sacar "factor comn" del cdigo que escribimos, as que los atributos y
mtodos de la clase SeleccionFutbol los tendrn tambin los objetos de las clases
Futbolista, Entrenador y Masajista. Antes de seguir vamos a mostrar el cdigo de
la clase "SeleccionFutbol" para ver algunas peculiaridades:
public abstract class SeleccionFutbol {

protected int id;

protected String nombre;

protected String apellidos;

protected int edad;

// constructores, getter y setter

public void viajar() {

System.out.println("Viajar (Clase Padre)");

public void concentrarse() {

System.out.println("Concentrarse (Clase Padre)" );

// IMPORTANTE -> METODO ABSTRACTO => no se implementa en la clase abs


tracta pero si en la clases hijas

public abstract void entrenamiento();

public void partidoFutbol() {

System.out.println("Asiste al Partido de Ftbol (Clase Padre)" );

Lo primero que nos debe de llamar la atencin al ver este cdigo es que
utilizamos dos veces la palabra reservada "abstract". Esta palabra nos indica
que la clase "SeleccionFutbol" es una clase abstracta y las clases abstractas
no se pueden instanciar, por tanto nunca podremos hacer un "new
SeleccionFutbol()". Otra cosa que vemos es que tambin utilizamos la palabra
reservada abstract en un mtodo (en el mtodo entrenamiento). Esto quiere
decir que todas las clases hijas de la clase "SeleccionFubol" tienen que tener
implementado ese mtodo obligatoriamente. Por tanto con esto que se acaba
de contar y diciendo que la palabra "Polimorfismo" significa "muchas formas",
podis deducir que la clase "SeleccionFutbol" es una clase que puede adoptar
diferentes formas y en este ejemplo puede adoptar las formas de "Futbolista",
"Entrenador" y "Masajista".

Como vemos un "Entrenador", un "Futbolista" y un "Masajista" pertenecen a


la misma clase padre y por eso se instancian diciendo que es una SeleccionFutbol
y son nuevos objetos de las clases hijas. Por otro lado vemos que no se pueden
crear objetos de una clase abstracta, por tanto el crearnos el objeto "casillas"
nos da un error.

Y ahora si hemos dicho que hemos definido en la clase padre un mtodo


abstracto que es obligatorio implementar en las clases hijas Com o lo hacemos?.
Bueno vamos por partes. Una cosa muy buena que tiene la herencia y el
polimorfismo, es que las clases hijas no solo heredan los mtodos (o la
implementacin de los mtodos) de las clases padre, sino que las clases hijas se
pueden especializar. Esto significa que una clase hija puede "redefinir" los
mtodos de su clase padre; es decir, que se puede volver a escribir ese mtodo y
de ahi la especializacin. Para ello vamos a ver la implementacin de las clases
hijas:

public class Futbolista extends SeleccionFutbol {

private int dorsal;

private String demarcacion;

// constructor, getter y setter

@Override

public void entrenamiento() {


System.out.println("Realiza un entrenamiento (Clase Futbolista)" );

@Override

public void partidoFutbol() {

System.out.println("Juega un Partido (Clase Futbolista)");

public void entrevista() {

System.out.println("Da una Entrevista");

public class Entrenador extends SeleccionFutbol {

private int idFederacion;

// constructor, getter y setter

@Override

public void entrenamiento() {

System.out.println("Dirige un entrenamiento (Clase Entrenador)");

@Override

public void partidoFutbol() {

System.out.println("Dirige un Partido (Clase Entrenador)");

public void planificarEntrenamiento() {


System.out.println("Planificar un Entrenamiento");

public class Masajista extends SeleccionFutbol {

private String titulacion;

private int aniosExperiencia;

// constructor, getter y setter

@Override

public void entrenamiento() {

System.out.println("Da asistencia en el entrenamiento (Clase Masajista)


");

public void darMasaje() {

System.out.println("Da un Masaje");

Como vemos en el cdigo todas las clases hijas tienen implementada el


mtodo "entrenamiento()" ya que como dijimos al tenerlo en la clase padre como
mtodo abstracto, es obligatorio que todas las clases hijas tengan ese mtodo. Por
otro lado observamos en el cdigo que encima del mtodo "entrenamiento()" y
otros mtodos, tenemos la etiqueta "@Override". Esta etiqueta sirve para indicar
en el cdigo que estamos "re-escribiendo o especializando" un mtodo que se
encuentra en la clase padre y que queremos redefinir en la clase hija. Si os
fijis esta etiqueta solo y exclusivamente esta en los mtodos de las clases hijas
que tenemos definida en la clase padre, por tanto cuando se llame a esos
mtodos, las clases hijas ejecutaran el mtodo redefinido en la clase hija y las que
no lo hayan redefinido se ejecutar es mtodo de la clase padre. En la siguiente
imagen vemos como hacemos estas especializaciones:
Con todo esto ya podemos empezar a ejecutar el programa que simular el
comportamiento de los integrantes de la seleccin espaola y ver las diferentes
formas que adoptan cada uno de los integrantes de la seleccin. Para ello
empecemos mostrando el siguiente fragmento de cdigo:

public class Main {

// ArrayList de objetos SeleccionFutbol. Idenpendientemente de la cla


se hija a la que pertenezca el objeto

public static ArrayList<SeleccionFutbol> integrantes = new ArrayList<


SeleccionFutbol>();

public static void main(String[] args) {

SeleccionFutbol delBosque = new Entrenador(1, "Vicente", "De


l Bosque", 60, 28489);

SeleccionFutbol iniesta = new Futbolista(2, "Andres", "Inies


ta", 29, 6, "Interior Derecho");

SeleccionFutbol raulMartinez = new Masajista(3, "Ral", "Mar


tinez", 41, "Licenciado en Fisioterapia" , 18);
integrantes.add(delBosque);

integrantes.add(iniesta);

integrantes.add(raulMartinez);

// CONCENTRACION

System.out.println("Todos los integrantes comienzan una conc


entracion. (Todos ejecutan el mismo mtodo)");

for (SeleccionFutbol integrante : integrantes) {

System.out.print(integrante.getNombre() + " " + inte


grante.getApellidos() + " -> ");

integrante.concentrarse();

// VIAJE

System.out.println("nTodos los integrantes viajan para jugar


un partido. (Todos ejecutan el mismo mtodo)");

for (SeleccionFutbol integrante : integrantes) {

System.out.print(integrante.getNombre() + " " + inte


grante.getApellidos() + " -> ");

integrante.viajar();

.........

Como vemos nos hemos creado tres objetos de la clase SeleccionFutbol


que adoptan una de las tres formas que pueden adaptar (Entrenador, Futbolista y
Masajista) y los metemos en un ArrayList de objetos de la clase
SeleccionFutbol. Ahora al ejecutar este fragmento de cdigo vamos a ver que
todos tienen el mismo comportamiento a la hora de "concentrarse()" y "viajar()",
por tanto ejecutarn el mtodo de la clase padre:
Todos los integrantes comienzan una concentracion. (Todos ejecutan el mismo m
todo)

Vicente Del Bosque -> Concentrarse (Clase Padre)

Andres Iniesta -> Concentrarse (Clase Padre)


Ral Martinez -> Concentrarse (Clase Padre)

Todos los integrantes viajan para jugar un partido. (Todos ejecutan el mismo
mtodo)

Vicente Del Bosque -> Viajar (Clase Padre)


Andres Iniesta -> Viajar (Clase Padre)

Ral Martinez -> Viajar (Clase Padre)

Hasta el momento nada nuevo y sorprendente, pero ahora vamos a ver


como cada uno de los integrante al lanzarse los mismos mtodos
("entrenamiento()" y "partidoFutbol()") tienen un comportamiento diferente:

........

// ENTRENAMIENTO

System.out.println("nEntrenamiento: Todos los integrantes tienen su funcin e


n un entrenamiento (Especializacin)" );

for (SeleccionFutbol integrante : integrantes) {

System.out.print(integrante.getNombre() + " " + integrante.getApellid


os() + " -> ");

integrante.entrenamiento();

// PARTIDO DE FUTBOL

System.out.println("nPartido de Ftbol: Todos los integrantes tienen su funci


n en un partido (Especializacin)");

for (SeleccionFutbol integrante : integrantes) {

System.out.print(integrante.getNombre() + " " + integrante.getApellid


os() + " -> ");

integrante.partidoFutbol();

........
Vemos el resultado al ejecutar este fragmento de cdigo:

Entrenamiento: Todos los integrantes tienen su funcin en un entrenamiento (E


specializacin)

Vicente Del Bosque -> Dirige un entrenamiento (Clase Entrenador)


Andres Iniesta -> Realiza un entrenamiento (Clase Futbolista)

Ral Martinez -> Da asistencia en el entrenamiento (Clase Masajista)

Partido de Ftbol: Todos los integrantes tienen su funcin en un partido (Esp


ecializacin)
Vicente Del Bosque -> Dirige un Partido (Clase Entrenador)

Andres Iniesta -> Juega un Partido (Clase Futbolista)

Ral Martinez -> Asiste al Partido de Ftbol (Clase Padre)

En este caso vemos que todos los integrantes ejecutan el mtodo


"entrenamiento()" de forma diferente ya que al ser este mtodo abstracto en la
clase padre, les forzamos a las clases hijas a que implementen ese mtodo. Por el
contrario al ejecutar el mtodo "partidoFutbol()" vemos que el objeto de la clase
Masajista utiliza el mtodo implementado en la clase padre y en cambio los objetos
de la clase Futbolista y Entrenador ejecutan sus mtodo "re-implementados o
especializados" que se volvieron a escribir en sus clases.

Por ltimo vamos a ver que cada uno de los objetos puede ejecutar
mtodos propios que solamente ellos los tienen como son el caso de
"planificarEntrenamiento(), entrevista() y darMasaje()" que solo los pueden
ejecutar objetos de la clase Entrenador, Futbolista y Masajista respectivamente:

........

// PLANIFICAR ENTRENAMIENTO

System.out.println("nPlanificar Entrenamiento: Solo el entrenador tiene el m


todo para planificar un entrenamiento:");

System.out.print(delBosque.getNombre() + " " + delBosque.getApellidos() + " -


> ");

((Entrenador) delBosque).planificarEntrenamiento();

// ENTREVISTA

System.out.println("nEntrevista: Solo el futbolista tiene el mtodo para dar


una entrevista:");
System.out.print(iniesta.getNombre() + " " + iniesta.getApellidos() + " -> ")
;

((Futbolista) iniesta).entrevista();

// MASAJE

System.out.println("nMasaje: Solo el masajista tiene el mtodo para dar un ma


saje:");

System.out.print(raulMartinez.getNombre() + " " + raulMartinez.getApellidos()


+ " -> ");

((Masajista) raulMartinez).darMasaje();

........

Como resultado de la ejecucin de este fragmento de cdigo tenemos lo


siguiente:

Planificar Entrenamiento: Solo el entrenador tiene el mtodo para planificar


un entrenamiento:

Vicente Del Bosque -> Planificar un Entrenamiento

Entrevista: Solo el futbolista tiene el mtodo para dar una entrevista:

Andres Iniesta -> Da una Entrevista

Masaje: Solo el masajista tiene el mtodo para dar un masaje:


Ral Martinez -> Da un Masaje

CONCLUSIONES Y ACLARACIONES:
Como hemos visto el polimorfismo es un concepto un poco ms avanzado
que la herencia y puede ser muy util a la hora de jerarquizar y querer dar un patrn
de comportamiento comn a una serie de objetos que heredan de la misma clase.
En esta entrada no hemos visto todo lo referente al polimorfismo ya que nos
quedara ver un concepto un poco ms avanzado en Java (y en otros lenguajes
tambin) como son las "Interface" (clases abstractas puras) de las cuales
hablaremos en otra entrada para terminar de ver lo que es el polimorfismo.

Por ltimo es muy probable para los que estis empezando con la POO
que no veis mucho sentido a esto del polimorfismo y al principio es normal. Solo
os debo de decir que a base de experiencia se le encuentra sentido al
polimorfismo, por tanto si teneis que hacer alguna prctica en la universidad o lo
que sea en la que tengais que usar el polimorfismo intentar entenderlo y hacer lo
que os pidan porque entenderlo 100% es complicado y se requiere de experiencia
para ello.

Polimorfismo en Java -Interface-


(Parte II), con ejemplos

El proyecto de este post lo puedes descargar pulsando AQUI.

En esta entrada vamos a continuar hablando de polimorfismo y en concreto


vamos a explicar las "Interface" y como siempre lo vamos ha hacer con un
ejemplo. Para entender lo que vamos a contar en esta entrada es imprescindible
que sepais que es la herencia y el polimorfismo, por tanto sino teneis muy claros
estos conceptos recomendamos que mireis los siguientes tutoriales en los que
hablamos sobre ello:

Herencia -> Herencia en Java, con ejemplos


Polimorfismo -> Polimorfismo en Java (Parte I), con ejemplos

El concepto de Interface lleva un paso ms alla el concepto de una clase


abstracta en la que vimos que una clase abstracta es una clase que no se
puede instanciar (crear un objeto de esa clase) pero si se pueden definir
atributos e implementar mtodos en ella para que sus clases hijas los
puedan utilizar. Pues bien una Interface es una clase abstracta pura en la que
todos sus mtodos son abstractos y por tanto no se pueden implementar en
la clase Interface. Mucho podreis pensar para que vale una clase abstracta pura
en la que no se permiten implementar mtodos y que encima en las clases hijas de
esa interface tengan que tener "si o si" implementados estos mtodos; pues
bien, las Interfaces sirven para establecer la forma que debe de tener una
clase. Un ejemplo que hay en Java sobre Interace es la Interface Map. En la
entrada "Map en Java, con ejemplos", vimos que habia diferentes tipos de Map; en
concreto los HashMap, TreeMap y LinkedHashMap, lo que quiere decir que todas
las clases Map deben de tener implementadas a su manera los mismo mtodos
como el "put()", "get()", "remove()", etc. y asi lo vimos en esta entrada en la que un
HashMap inserta los datos de manera diferente a un TreeMap y al
LinkedHashMap. Por tanto vemos como se ha establecido una forma comn que
deben de respetar todos los Maps de Java.

Por otro lado se ha de decir que una Interface no se pueden definir


atributos salvo que estos sean estaticos o constantes; es decir, "static" o "final".

Siguiendo con los ejemplos que hemos estado poniendo en las entradas de
la Herencia y el Polimorfismo, vamos a ver un ejemplo en el que simularemos el
comportamiento que tendran los diferentes integrantes de la seleccin espaola
de ftbol; tanto los Futbolistas como el cuerpo tcnico (Entrenadores, Masajistas,
etc). Para este ejemplo nos vamos a basar en el siguiente diagrama de clases:

Lo primero que vemos es la clase "IntegranteSeleccionFutbol" que es una


Interface en la que tiene definido cuatro mtodos (es decir una clase abstracta
pura). Como se ha dicho en esta clase solo se definen los mtodos pero no se
implementan; as que a nivel de cdigo la clase quedaria de la siguiente manera:

public interface IntegranteSeleccionFutbol {

void concentrarse();

void viajar();

void entrenar();
void jugarPartido();

Lo siguiente que vemos en el diagrama de clases es la


clase "SeleccionFutbol" que es una clase abstracta que utiliza (implements)
la Interface "IntegranteSeleccionFutbol". Al ser esta una clase abstracta no se
puede instanciar y por tanto en ella no es necesario implementar los mtodos de la
"Interfece"; pero si ser obligatorio implementarlo en sus clases hijas (Futbolista,
Entrenador y Masajista). Para que veamos bien el uso de las interfaces, vamos ha
hacer primero una "chapuzilla" para entender su utilizacin. Lo que vamos ha
hacer es "no implementar los mtodos de la interface en la clase abstracta
SeleccionFutbol" con el fin de que veamos que en las clases hijas nos van a exigir
que implementemos los mtodos de la interface. Para ello la clase abstracta
quedara de la siguiente forma (sin ningn mtodo implementado):

public abstract class SeleccionFutbol implements IntegranteSeleccionFutbol {

protected int id;

protected String nombre;

protected String apellidos;

protected int edad;

public SeleccionFutbol() {

public SeleccionFutbol(int id, String nombre, String apellidos, int e


dad) {

this.id = id;

this.nombre = nombre;

this.apellidos = apellidos;

this.edad = edad;

}
// getter y setter

En este punto vemos una nueva palabra reservada como es la palabra


"implements" que quiere decir que la clase "SeleccionFutbol" debe ser una clase
que adopte la forma que tiene la Interface "IntegranteSeleccionFutbol"; es decir,
que debe tener implementados los mtodos de la Interface. En este caso al ser
una clase abstracta las podemos implementar ahi (si queremos) o en las clases
hijas (obligatoriamente sino las implementamos en la clase padre), por eso el
ejemplo que ponemos es para ver como el compilador nos exigir que esos
mtodos estn implementados en las clases hijas.

Por tanto sino implementamos los mtodos en la clase padre


("SeleccionFutbol") y nos vamos a cualquiera de las clases hijas (por ejemplo la de
futbolista) vemos como nos exigen que implementemos esos mtodos:

Vemos en la clase futbolista (en el IDE de Eclipse) que nos da un error y


como solucin nos dice que tenemos que implementar los mtodos
"concentrarse()", "viajar()", etc. Si en Eclipse seleccionamos una de las opciones
para solucionar el error, vemos que nos da la opcin de "Aadir los mtodos no
implementados" (add unimplemented methods):
Si seleccionamos esa opcin vemos como en Eclipse nos implementa los
mtodos de la Interface de forma automtica:
Como ya hemos visto que nos exigen implementar los mtodos en la
Interface en las clases hijas, ahora vamos ha hacer las cosas bien y vamos a
implementar los mtodos de la Interface en la clase padre ("SeleccionFutbol") para
que solamente haya que implementar los mtodos que queramos especializarlos
en las clases hijas. Por tanto la clase "SeleccionFutbol" bien implementada
quedaria de la siguiente forma:

public abstract class SeleccionFutbol implements IntegranteSeleccionFutbol {

protected int id;

protected String nombre;

protected String apellidos;

protected int edad;

// Constructor, getter y setter

public void concentrarse() {

System.out.println("Concentrarse (Clase Padre)");

public void viajar() {

System.out.println("Viajar (Clase Padre)");

public void entrenar() {

System.out.println("Entrenar (Clase Padre)");

public void jugarPartido() {


System.out.println("Asiste al Partido de Ftbol (Clase Padre
)");

Y en las clases hijas solo implementaremos los mtodos de la clase padre


que queramos redefinir, quedando las clases hijas de la siguiente forma (recordar
que la etiqueta "@Override" significa que ese mtodo esta siendo redefinido)::

public class Futbolista extends SeleccionFutbol {

private int dorsal;

private String demarcacion;

// Constructor, getter y setter

@Override

public void entrenar() {

System.out.println("Realiza un entrenamiento (Clase Futbolis


ta)");

@Override

public void jugarPartido() {

System.out.println("Juega un Partido (Clase Futbolista)");

public void entrevista() {

System.out.println("Da una Entrevista");

}
}

public class Entrenador extends SeleccionFutbol {

private int idFederacion;

// Constructor, getter y setter

@Override

public void entrenar() {

System.out.println("Dirige un entrenamiento (Clase Entrenado


r)");

@Override

public void jugarPartido() {

System.out.println("Dirige un Partido (Clase Entrenador)");

public void planificarEntrenamiento() {

System.out.println("Planificar un Entrenamiento");

public class Masajista extends SeleccionFutbol {

private String titulacion;

private int aniosExperiencia;

// Constructor, getter y setter


@Override

public void entrenar() {

System.out.println("Da asistencia en el entrenamiento (Clase


Masajista)");

public void darMasaje() {

System.out.println("Da un Masaje");

Llegados a este punto ya tenemos implementada las misma funcionalidad


que hicimos en la entrada de Polimorfismo en Java (Parte I), con ejemplos pero
diseada e implementada de otra forma, as que vamos a poner el cdigo que
escribimos para esa entrada y el resultado de la ejecucin del mismo para que
podais ver el resultado:

public class Main {

// ArrayList de objetos SeleccionFutbol. Idenpendientemente de la cla


se hija a la que pertenezca el objeto

public static ArrayList integrantes = new ArrayList();

public static void main(String[] args) {

SeleccionFutbol delBosque = new Entrenador(1, "Vicente", "De


l Bosque", 60, 28489);

SeleccionFutbol iniesta = new Futbolista(2, "Andres", "Inies


ta", 29, 6, "Interior Derecho");

SeleccionFutbol raulMartinez = new Masajista(3, "Ral", "Mar


tinez", 41, "Licenciado en Fisioterapia" , 18);

integrantes.add(delBosque);
integrantes.add(iniesta);

integrantes.add(raulMartinez);

// CONCENTRACION

System.out.println("Todos los integrantes comienzan una conc


entracion. (Todos ejecutan el mismo mtodo)");

for (SeleccionFutbol integrante : integrantes) {

System.out.print(integrante.getNombre() + " " + inte


grante.getApellidos() + " -> ");

integrante.concentrarse();

// VIAJE

System.out.println("nTodos los integrantes viajan para jugar


un partido. (Todos ejecutan el mismo mtodo)");

for (SeleccionFutbol integrante : integrantes) {

System.out.print(integrante.getNombre() + " " + inte


grante.getApellidos() + " -> ");

integrante.viajar();

// ENTRENAMIENTO

System.out.println("nEntrenamiento: Todos los integrantes ti


enen su funcin en un entrenamiento (Especializacin)");

for (SeleccionFutbol integrante : integrantes) {

System.out.print(integrante.getNombre() + " " + inte


grante.getApellidos() + " -> ");

integrante.entrenar();

// PARTIDO DE FUTBOL

System.out.println("nPartido de Ftbol: Todos los integrante


s tienen su funcin en un partido (Especializacin)" );
for (SeleccionFutbol integrante : integrantes) {

System.out.print(integrante.getNombre() + " " + inte


grante.getApellidos() + " -> ");

integrante.jugarPartido();

// PLANIFICAR ENTRENAMIENTO

System.out.println("nPlanificar Entrenamiento: Solo el entre


nador tiene el mtodo para planificar un entrenamiento:");

System.out.print(delBosque.getNombre() + " " + delBosque.get


Apellidos() + " -> ");

((Entrenador) delBosque).planificarEntrenamiento();

// ENTREVISTA

System.out.println("nEntrevista: Solo el futbolista tiene el


mtodo para dar una entrevista:");

System.out.print(iniesta.getNombre() + " " + iniesta.getApel


lidos() + " -> ");

((Futbolista) iniesta).entrevista();

// MASAJE

System.out.println("nMasaje: Solo el masajista tiene el mto


do para dar un masaje:");

System.out.print(raulMartinez.getNombre() + " " + raulMartin


ez.getApellidos() + " -> ");

((Masajista) raulMartinez).darMasaje();

Como resultado a la ejecucin de este programa tenemos lo siguiente:

Todos los integrantes comienzan una concentracion. (Todos ejecutan el mismo m


todo)
Vicente Del Bosque -> Concentrarse (Clase Padre)

Andres Iniesta -> Concentrarse (Clase Padre)

Ral Martinez -> Concentrarse (Clase Padre)

Todos los integrantes viajan para jugar un partido. (Todos ejecutan el mismo
mtodo)
Vicente Del Bosque -> Viajar (Clase Padre)

Andres Iniesta -> Viajar (Clase Padre)

Ral Martinez -> Viajar (Clase Padre)

Entrenamiento: Todos los integrantes tienen su funcin en un entrenamiento (E


specializacin)
Vicente Del Bosque -> Dirige un entrenamiento (Clase Entrenador)

Andres Iniesta -> Realiza un entrenamiento (Clase Futbolista)


Ral Martinez -> Da asistencia en el entrenamiento (Clase Masajista)

Partido de Ftbol: Todos los integrantes tienen su funcin en un partido (Esp


ecializacin)

Vicente Del Bosque -> Dirige un Partido (Clase Entrenador)


Andres Iniesta -> Juega un Partido (Clase Futbolista)

Ral Martinez -> Asiste al Partido de Ftbol (Clase Padre)

Planificar Entrenamiento: Solo el entrenador tiene el mtodo para planificar


un entrenamiento:
Vicente Del Bosque -> Planificar un Entrenamiento

Entrevista: Solo el futbolista tiene el mtodo para dar una entrevista:


Andres Iniesta -> Da una Entrevista

Masaje: Solo el masajista tiene el mtodo para dar un masaje:


Ral Martinez -> Da un Masaje

CONCLUSIONES Y ACLARACIONES:
Como hemos visto el concepto de la Interface va un paso ms alla en lo
referente al concepto de la clase abstracta. Es una muy buena prctica de diseo
la utilizacin de clases Interface para definir clases que tengan una misma forma,
aunque en ellas realicen comportamientos distintos.
Al igual que comentamos en las conclusiones de la entrada del
polimorfismo, es muy probable que los que empeceis con la POO no le veais
mucho sentido al tema de las clases Interface, as que no os preocupeis si eso es
asi porque estos conceptos se consolidan a base de experiencia y de ir
adquiriendo ms conocimientos de arquitectura y diseo del software.

Vous aimerez peut-être aussi