Manual - Algoritmos y Estructuras de Datos
Manual - Algoritmos y Estructuras de Datos
Estructura de Datos
ALGORITMOS Y ESTRUCTURA DE DATOS Página 2
Indice
PRESENTACIÓN 4
RED DE CONTENIDOS 5
CLASES Y OBJETOS 6
ARREGLO LINEAL 57
2.1. CONCEPTOS Y OPERACIONES SIMPLES ______________________________________________________ 58
2.1.1. DESCRIPCIÓN 58
2.1.2. DECLARACIÓN E INICIALIZACIÓN 58
2.1.3. DECLARACIÓN PRIVADA E INICIALIZACIÓN 59
2.1.4. RECORRIDO 59
2.1.5. REMPLAZO 60
2.1.6. OPERACIONES PÚBLICAS BÁSICAS 60
2.1.7. OPERACIONES PÚBLICAS COMPLEMENTARIAS 60
CLASE ARRAYLIST 83
ARCHIVOS 146
ANEXO 168
6.1. CASO INMOBILIARIA ________________________________________________________________ 169
6.2. MISCELANEA ____________________________________________________________________ 196
Presentación
Algoritmos y Estructura de Datos pertenece a la línea de programación y desarrollo de
aplicaciones y se dicta en las carreras de Computación e Informática, Administración y Sistemas,.
Análisis de Datos Empresariales y Arquitectura de Datos Empresariales. Brinda un conjunto de
técnicas de programación que permite a los alumnos diseñar algoritmos apropiados y adquirir
buenos hábitos de programación.
El manual para el curso ha sido diseñado bajo la modalidad de unidades de aprendizaje, las que se
desarrollan durante semanas determinadas. En cada una de ellas, hallará los logros, que debe
alcanzar al final de la unidad; el tema tratado, el cual será ampliamente desarrollado; y los
contenidos, que debe desarrollar, es decir, los subtemas. Por último, encontrará las actividades
que deberá desarrollar en cada sesión, que le permitirán reforzar lo aprendido en la clase.
Red de contenidos
Algoritmos y Estructura de Datos
Clases y objetos
Arreglo lineal
Conceptos básicos
Clase ArrayList
Operaciones variadas
Herencia y Polimorfismo
Generalización/Especialización
Herencia/Polimorfismo
Interfaces
Archivos
Manejo de un archivo
Aplicaciones variadas
UNIDAD
1
CLASES Y OBJETOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, los alumnos crean clases clasificadas en paquetes, crean objetos,
emplean los modificadores de acceso: public y private así como la referencia this en Java.
Finalmente, entienden el concepto de encapsulamiento.
TEMARIO
1.1. Tema 1 : Conceptos básicos de POO
1.1.1 : Introducción
1.1.2 : Clase
1.1.3 : Objeto
1.1.4 : Declaración y creación de objetos
1.1.5 : Acceso a los miembros de l a clase
1.1.6 : Paquete
1.1.7 : Especificador de acceso public
1.1.8 : Sentencia import
1.2. Tema 2 : Control de acceso y encapsulamiento
1.2.1 : Dirección de memoria de un objeto
1.2.2 : Asignación entre referencias
1.2.3 : Constructor
1.2.4 : Creación e inicialización de objetos
1.2.5 : Especificador de acceso private
1.2.6 : Encapsulamiento
1.2.7 : Métodos de acceso: set/get
1.3. Tema 3 : Miembros de clase, constantes y sobrecarga
1.3.1 : Referencia this
1.3.2 : Modificador static
1.3.3 : Bloque de inicialización static
1.3.4 : Sobrecarga
1.3.5 : Uso del this en sobrecarga
1.3.6 : Modificador final
1.3.7 : Librería
1.4. Tema 4 : Clase String
1.4.1 : Descripción
1.4.2 : Métodos básicos de la clase String
1.4.3 : Concatenación
1.4.4 : Recorrido
ACTIVIDADES PROPUESTAS
• Crear objetos de diversas clases.
• Emplear y diferenciar los especificadores de acceso: public y private.
• Realizar operaciones con objetos creados y entre referencias.
• Entender el concepto de sobrecarga.
• Emplear el modificador e inicializador static y reconocer una librería
1.1.1. Introducción
En el mundo real vivimos rodeados de objetos: personas, sillas, computadoras, tazas, platos, etc.
Los objetos en la POO son entidades o unidades independientes que poseen atributos y
operaciones.
Los atributos son las características del objeto que se representan mediante variables.
Las operaciones son las formas de operar del objeto que se representan mediante métodos.
En el mundo real, para poder fabricar objetos, se requiere de un plano o un conjunto de planos.
En forma similar, para poder crear un objeto software, se requiere de una clase o modelo.
1.1.2. Clase
Una clase es una plantilla (más propiamente, un tipo de dato) que especifica los atributos
(mediante variables denominadas variables miembro) y las operaciones (mediante métodos
denominados métodos miembro) de un tipo de objeto a crear.
class NombreClase {
…
}
1.1.2.2. Implementación
Una clase es una plantilla que especifica los atributos y el comportamiento de un determinado
tipo de objeto.
Atributos:
código,
nombre, y
dos notas
class Alumno {
// Atributos
int codigo, nota1, nota2;
String nombre;
// Operaciones
double promedio() {
return (nota1 + nota2) / 2.0;
}
}
1.1.3. Objeto
La JVM (Java Virtual Machine) carga a la memoria el código de bytes de una clase en el primer
momento en que la clase sea mencionada durante la ejecución del programa.
Para cada objeto se creará una copia de cada una de las variables miembro.
Los métodos miembro son compartidos por todos los objetos de la clase.
La clase se carga a la memoria RAM la primera vez que se menciona en el código, en adelante
será utilizada desde la RAM para crear objetos (se convierte en una fábrica de objetos).
1.1.4.1. Declaración
NombreClase nombreObjeto;
1.1.4.2. Creación
Un objeto creado referencia una dirección de memoria. El operador new crea el objeto
dinámicamente (en tiempo de ejecución).
Cada vez que se crea un objeto se crea una copia de cada una de las variables miembro
declaradas por su clase. Estas variables, propias de cada objeto, se denominan variables de
instancia. En cambio, los métodos, son compartidos por todos los objetos.
Para acceder a un miembro de una clase se escribe el nombre del objeto, el símbolo punto y el
nombre de la variable miembro o método miembro al que se desea acceder.
Ejercicio 02: Declare y crree un objeto de tipo Alumno e ingrese datos fijos a sus atributos.
Finalmente muestre su dirección de memoria, los datos completos del alumno y también su
promedio.
1.1.6. Paquete
Un paquete es un conjunto de clases agrupadas que guardan una relación entre sí. Los paquetes
se declaran utilizando la palabra package seguida del nombre del paquete. Esta instrucción tiene
que colocarse al inicio del archivo y es la primera sentencia en ejecutarse. Ejemplo:
package gui;
…
public class Ejemplo extends JFrame {
…
}
Al crearse un paquete se crea una carpeta con el mismo nombre del paquete. Si coloca la misma
instrucción package al inicio de otras clases logrará agrupar varias clases en el mismo paquete.
Todo nombre de package debe comenzar con una letra minúscula.
package gui;
class Alumno {
// Atributos
int codigo, nota1, nota2;
String nombre;
// Operaciones
double promedio() {
return (nota1 + nota2) / 2.0;
}
}
package semana_01;
// Operaciones
double promedio() {
return (nota1 + nota2) / 2.0;
}
}
1.1.7. Especificador de acceso public
Los atributos y operaciones también tienen que ser declarados como public.
package semana_01;
// Operaciones públicas
public double promedio() {
return (nota1 + nota2) / 2.0;
}
}
Se utiliza para incluir una lista de paquetes en donde se buscará una determinada clase. Su
aplicación se aprecia cuando hacemos referencia a una clase desde otra que se encuentra fuera
del paquete.
Ejemplo:
import semana_01.Alumno;
El carácter asterisco indica que se importe todas las clases del paquete.
Ejemplo:
import semana_01.*;
package gui;
import semana_01.Alumno;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Font;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Ejemplo frame = new Ejemplo();
frame.setVisible(true);
}
catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Ejemplo() {
setTitle("Ejemplo");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 500);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
a.codigo = 12345;
a.nombre = "Juan";
a.nota1 = 13;
a.nota2 = 15;
Ejercicios
Ejercicio Propuesto 1
Diseñe la clase Trabajador en el paquete semana_01 con los atributos públicos: codigo (int),
nombre (String), horas trabajadas (int) y tarifa horaria (double).
Implemente además:
- Un método que retorne el sueldo bruto (horas * tarifa).
- Un método que retorne el descuento de acuerdo a la siguiente tabla:
Ejercicio Propuesto 2
Diseñe la clase Filmacion en el paquete semana_01 con los atributos públicos: codigo (int), título
(String), duración en minutos (entero) y precio en soles (double).
Implemente además:
- Un método que retorne el precio del video en dólares. Considere que: 1 dólar = 3.38 soles.
Ejercicio Propuesto 3
Diseñe la clase Persona en el paquete semana_01 con los atributos públicos: nombre (String),
apellido (String), edad (int), estatura (double) y peso (double).
Implemente además:
- Un método que retorne el estado de la persona entre: “menor de edad” o “mayor de edad”.
- Un método que retorne el índice de masa corporal de la persona (peso/estatura²).
Ejercicio Propuesto 4
Diseñe la clase Coordinador en el paquete semana_01 con los atributos públicos: codigo (int),
nombre (String), categoria (int) y número de celular (int).
Implemente además:
- Un método que retorne el sueldo del coordinador sabiendo que:
categoría sueldo
0 S/. 8500
1 S/. 6850
2 S/. 5500
Ejercicio Propuesto 5
Diseñe la clase Expositor en el paquete semana_01 con los atributos públicos: codigo (int),
nombre (String), horas trabajadas (int) y tarifa por hora (double).
Implemente además:
- Un método que retorne el sueldo bruto (horas * tarifa).
- Un método que retorne el descuento por AFP (10% del sueldo bruto).
- Un método que retorne el descuento por EPS (5% del sueldo bruto).
- Un método que retorne el sueldo neto (sueldo bruto – descuentoAFP – descuentoEPS).
Ejercicio Propuesto 6
Diseñe la clase Docente en el paquete semana_01 con los atributos públicos: codigo (int),
nombre (String), horas trabajadas (int) y tarifa por hora (double).
Implemente además:
- Un método público que retorne el sueldo (horas * tarifa).
Ejercicio Propuesto 7
Diseñe la clase Numeros en el paquete semana_01 con los atributos públicos: numero1 (int),
numero2 (int) y numero3 (int).
Ejercicio Propuesto 8
Diseñe la clase Caja en el paquete semana_01 con los atributos públicos: largo en centímetros
(double), ancho en centímetros (double), alto en centímetros (double) y peso de balanza en
kilogramos (double).
Ejercicio Propuesto 9
Diseñe la clase Equipo en el paquete semana_01 con los atributos públicos: codigo (int), marca
(String), color (String) y precio en dólares (double).
Implemente además:
- Un método que retorne el precio del equipo en soles. Considere que: 1 dólar = 3.38 soles.
- Un método que retorne el precio del equipo en euros. Considere que: 1 euro = 1.20 dólares.
Ejercicio 06: Declare y cree el objeto a de tipo Alumno. Visualice la información por defecto a
través del método listado que recibe en el parámetro x la referencia del objeto. Declare luego el
Alumno b y asígnelo directamente al objeto a. A través del objeto b ingrese datos al alumno y
visualice la información del objeto a.
Alumno b = a;
b.codigo = 12345;
b.nombre = "Juan";
b.nota1 = 13;
b.nota2 = 15;
listado(a);
}
1.2.3. Constructor
Es el mecanismo que permite crear un objeto. El constructor de una clase se caracteriza por
tener el mismo nombre de su clase y no tener tipo de retorno. Si una clase no define constructor,
Java asume por defecto un constructor sin parámetros que no realiza actividad adicional. Un
constructor permite además inicializar los atributos del objeto al momento de crearlo.
Ejercicio 07: Implemente un constructor en la clase Alumno que reciba información (a través
de parámetros) e inicialice a los atributos.
package semana_02;
// Constructor
public Alumno(int cod, String nom, int n1, int n2) {
codigo = cod;
nombre = nom;
nota1 = n1;
nota2 = n2;
}
// Operaciones públicas
public double promedio() {
return (nota1 + nota2) / 2.0;
}
}
Forma 1
Forma 2
Ejercicio 08: A la pulsación del botón Procesar declare, cree e inicialice un objeto de tipo
Alumno con datos fijos, modifique luebo sus notas y visualice nuevamente la información actual.
a.nota1 = 19;
a.nota2 = 18;
listado(a);
}
Prohibe el acceso externo a los elementos declarados de esta forma. Al declarar los atributos
como privados no podrán ser invocados desde afuera de la clase. En el interior de la clase el
private no tiene efecto.
Ejemplo:
package semana_02;
1.2.6. Encapsulamiento
Es la capacidad de ocultar los detalles internos del comportamiento de una clase y exponer o
dar a conocer sólo los detalles que sean necesarios para el resto de clases. Este ocultamiento
nos permite restringir y controlar el uso de la clase. Restringir porque habrán ciertos atributos
y métodos privados o protegidos y controlar porque habrán ciertos mecanismos para modificar
el estado de nuestra Clase.
Una Clase puede controlar qué partes de un programa pueden acceder a los miembros de su
Clase: variables miembro y métodos miembro. Una Clase bien diseñada impide el acceso directo
a sus variables miembro proporcionando a cambio un conjunto de métodos de acceso que sirvan
como intermediarios entre las variables miembro y el mundo exterior. Esto permite controlar el
uso correcto de las variables miembro pues los métodos de acceso pueden actuar como filtros
que prueben los datos que se pretenden ingresar a las variables miembro. Por otra parte,
algunos métodos de la Clase pueden ser necesarios sólo desde el interior de la Clase por lo que
deben quedar restringidos sólo para uso interno.
Para controlar el acceso a los miembros de una Clase se usan especificadores o modificadores
de acceso que se anteponen a las declaraciones de los miembros a controlar. Los especificadotes
de acceso son: public, private y protected. Se ve la aplicación del especificador de acceso
protected cuando se trabaja con herencia, por lo que lo veremos más adelante. En la tabla que
sigue se muestra el uso de los especificadores de acceso.
La primera columna indica si la propia clase tiene acceso al miembro definido por el
especificador de acceso. La segunda columna indica si las subclases de la clase (sin importar
dentro de que paquete se encuentren estas) tienen acceso a los miembros. La tercera columna
indica si las clases del mismo paquete que la clase (sin importar su parentesco) tienen acceso a
los miembros. La cuarta columna indica si todas las clases tienen acceso a los miembros.
2. Métodos públicos para acceder a los atributos privados. Se forman con los prefijos set o
get seguido del nombre del atributo.
2.1. Todo método de acceso público set es del tipo void y a través de un parámeto recibe
un nuevo contenido a imponer en el atributo privado.
Ejemplo:
public void setCodigo(int cod) {
codigo = cod;
}
2.2. Todo método de acceso público get responde al tipo de dato del atributo privado,
no usa parámetros y retorna el contenido actual del atributo privado.
Ejemplo:
public int getCodigo() {
return codigo;
}
Ejercicio 09: Haga que las variables miembro de la clase Alumno sean de uso privado y declare
sus respectivos métodos de acceso set/get.
package semana_02;
// Constructor
public Alumno(int cod, String nom, int n1, int n2) {
codigo = cod;
nombre = nom;
nota1 = n1;
nota2 = n2;
}
// Operaciones públicas
public double promedio() {
return (nota1 + nota2) / 2.0;
}
}
Ejercicio 10: A la pulsación del botón Procesar declare, cree e inicialice un objeto de tipo
Alumno con datos fijos, modifique luego sus notas y visualice nuevamente la información actual.
a.setNota1(19);
a.setNota2(18);
listado(a);
}
Ejercicios
Ejercicio Propuesto 1
Diseñe la clase Celular en el paquete semana_02 con los atributos privados: número (int),
usuario (String), segundos consumidos (int) y precio por segundo (double).
Implemente además:
- Un Constructor que inicialice los atributos.
- Métodos de acceso público set/get para todos los atributos privados.
- Un método que retorne el costo por consumo (segundos*precio).
- Un método que retorne el impuesto por IGV (18% del costo por consumo).
- Un método que retorne el total a pagar (costo por consumo + impuesto por IGV).
Ejercicio Propuesto 2
Diseñe la clase Computadora en el paquete semana_02 con los atributos privados: codigo (int),
marca (String), color (String) y precio en dólares (double).
Implemente además:
- Un Constructor que inicialice los atributos.
- Métodos de acceso público set/get para todos los atributos privados.
- Un método que retorne el precio de la computadora en soles (1 dólar = 3.25 soles).
- Un método que retorne el precio de la computadora en euros (1 euro = 1.20 dólares).
Ejercicio Propuesto 3
Diseñe la clase Edificio en el paquete semana_02 con los atributos privados: código (int),
número de departamentos (int), cantidad de pisos del edificio (int) y precio de un departamento
en dólares (double).
Implemente además:
- Un Constructor que inicialice los atributos.
- Métodos de acceso público set/get para todos los atributos privados.
- Un método que retorne el precio en dólares del edificio (#dptos * precio de un dpto).
Ejercicio Propuesto 4
Diseñe la clase Obrero en el paquete semana_02 con los atributos privados: codigo (int),
nombre (String), horas trabajadas (int) y tarifa por hora (double). Implemente además:
Ejercicio Propuesto 5
Diseñe la clase Video en el paquete semana_02 con los atributos privados: codigo (int), nombre
del video (String), duración (double), precio en soles (double) y tipo de cambio (double).
Implemente además:
- Un Constructor que inicialice los atributos.
- Métodos de acceso público set/get para todos los atributos privados.
- Un método que retorne el precio del video en dólares.
Ejercicio Propuesto 6
Diseñe la clase Paciente en el paquete semana_02 con los atributos privados: nombre (String),
apellido (String), edad (int), talla (double) y peso (double).
Implemente además:
- Un Constructor que inicialice los atributos.
- Métodos de acceso público set/get para todos los atributos privados.
- Un método que retorne el texto: “menor de edad” o “mayor de edad”.
Ejercicio Propuesto 7
Diseñe la Clase Empleado en el paquete semana_02 con los atributos privados: codigo (int),
nombre (String), número de celular (int) y sueldo en soles (double).
Implemente además:
- Un Constructor que inicialice los atributos.
- Métodos de acceso público set/get para todos los atributos privados.
- Un método que retorne un texto indicando si el sueldo es “mayor a 3500”, “menor a
3500” o “igual a 3500”.
Ejercicio Propuesto 8
Diseñe la Clase Asesor en el paquete semana_02 con los atributos privados: codigo (int), nombre
(String), horas trabajadas (int) y tarifa por hora (double).
Implemente además:
- Un Constructor que inicialice los atributos.
- Métodos de acceso público set/get para todos los atributos privados.
- Un método que retorne el sueldo bruto (horas*tarifa).
- Un método que retorne el descuento (15% del sueldo bruto).
- Un método que retorne el sueldo neto (sueldo bruto - descuento).
Ejercicio Propuesto 9
Diseñe la Clase Pelota en el paquete semana_02 con atributos privados: marca (String), peso en
gramos (double), presión en libras (double), diámetro en centímetros (double) y precio (double).
Implemente además:
- Un Constructor que inicialice los atributos.
- Métodos de acceso público set/get para todos los atributos privados.
- Un método que retorne el radio (diámetro / 2).
- Un método que retorne el volumen del balón (4 * 3.1416 * radio* radio * radio / 3).
- Un método que retorne el descuento (10% del precio).
- Un método que retorne el importe a pagar (precio - descuento).
Es un parámetro oculto añadido por el compilador. Una de sus aplicaciones más comunes es
cuando el nombre de un parámetro coincide en sintaxis con el atributo. En este caso, su objetivo
es diferenciar la variable miembro del parámetro en sí. Lo veremos en el constructor y cada
método set.
Ejemplo:
package semana_03;
// Atributos privados
private int codigo, nota1, nota2;
private String nombre;
// Constructor
public Alumno(int codigo, String nombre, int nota1, int nota2) {
this.codigo = codigo;
this.nombre = nombre;
this.nota1 = nota1;
this.nota2 = nota2;
}
Dentro de un método de la clase, la referencia this contiene la dirección de memoria del objeto
que invocó al método. Se usa también para referenciar al objeto que invocó a un método.
Se usa para hacer que un atributo o método se convierta en único para todos los objetos. Este
mecanismo permite manejar contadores y acumuladores desde el interior de la Clase.
Un método de clase puede operar únicamente sobre variables de clase y/o métodos de clase y
no puede usar la referencia this.
// Constructor
public Alumno(…, …, …, …) {
cantidad ++;
}
…
// Métodos públicos de clase: set/get
public static void setCantidad(int cantidad) {
Alumno.cantidad = cantidad;
}
Lo conforman una serie de códigos que se ejecutan antes de cualquier llamado a la clase o algún
objeto de la clase.
Se utiliza para inicializar variables, crear conexiones a base de datos o ejecutar cualquier código
que sea prioritario antes de cualquier tipo de ejecución en la clase que se define.
Ejemplo:
// Bloque de inicialización
static {
cantidad = 0;
}
…
// Constructor
public Alumno(…, …, …, …) {
…
cantidad ++;
}
…
}
Toda clase se carga en memoria al crearse el primer objeto o al utilizar un atributo static o
método static. Al cargarse la clase primero se ejecutan los inicializadores static y luego el
constructor de la clase.
1.3.4. Sobrecarga
Consiste en crear varios constructores o métodos con el mismo nombre siempre y cuando no
coincidan sus parámetros en orden de tipología. El riesgo de aplicar sobrecarga es que más de
un atributo se pueda quedar con el valor de inicialización por defecto asumido por Java.
Ejemplo:
public Alumno() {
}
…
}
void imprimir(String s) {
txtS.append(s + "\n");
}
void imprimir() {
txtS.append("\n");
}
También se puede utilizar la referencia this para hacer que un constructor invoque a otro
constructor. Esto evita que algún atributo quede inicializado por defecto.
Ejemplo:
// Constructores
public Alumno(int codigo, String nombre, int nota1, int nota2) {
this.codigo = codigo;
this.nombre = nombre;
this.nota1 = nota1;
this.nota2 = nota2;
}
public Alumno() {
this(88888, "ninguno");
}
…
}
Se usa para hacer que un atributo static se convierta en constante para todos los objetos. Es
decir, una vez que el atributo asume un valor no podrá ser modificado. Al anteponer static final
a un atributo público, la variable única se convierte en constante de Clase.
Ejemplo:
1.3.7. Librería
Es una clase que implementa métodos static los cuales podrán ser invocados desde cualquier
parte del programa a través de la clase sin necesidad de tener que crear un objeto.
Ejemplo:
Ejercicios
Ejercicio Propuesto 1
Diseñe la clase Factura en el paquete semana_03 con los atributos privados: ruc (String),
empresa (String), unidades (int) y precio unitario (double).
Implemente además:
- Una variable privada de clase que cuente la cantidad de objetos tipo Factura creadas
(int).
- Una variable privada de clase que acumule la suma de los importes facturados (double).
- Una constante pública de clase (String).
- Un bloque de inicialización static para asignarle a la constante el texto “Sunat” e
inicializar con cero las variables privadas de clase.
- Un constructor que inicialice a todos los atributos, cuente la cantidad de objetos creados
y acumule los importes facturados. Haga uso de la referencia this.
- Un constructor con dos parámetros que inicialice sólo los atributos ruc y empresa,
invocando al primer constructor usando la referencia this, enviando con el valor 10 las
unidades y con 50.0 el precio unitario.
- Un constructor sin parámetros que invoque al segudo constructor usando la referencia
this, enviando con “11111111111” el ruc y con “MN-Global SRL” la empresa.
- Métodos de acceso público set para todos los atributos privados. Use de la referencia
this.
- Métodos de acceso público get para todos los atributos privados.
- Métodos públicos de clase set/get para las variables privadas de clase.
- Un método que retorne el importe facturado (unidades * precio unitario).
Ejercicio Propuesto 2
Diseñe la clase Empleado en el paquete semana_03 con los atributos privados: codigo (int),
nombre (String), categoria (int) y número de celular (int).
Implemente además:
- Una variable privada de clase que cuente la cantidad de objetos tipo Empleado creados
(int).
- Una variable privada de clase que acumule la suma de los sueldos netos (double).
- Una constante pública de clase para un factor de descuento (double).
- Un bloque de inicialización static para asignarle a la constante el valor 0.15 e inicializar
con cero las variables privadas de clase.
- Un constructor que inicialice a todos los atributos, cuente la cantidad de objetos creados
y acumule los sueldos netos. Haga uso de la referencia this.
- Un constructor con dos parámetros que inicialice sólo los atributos codigo y nombre,
invocando al primer constructor usando la referencia this, enviando con el valor 2 la
categoría y con 999999999 el número de celular.
Ejercicio Propuesto 3
Diseñe la clase Movil en el paquete semana_03 con los atributos privados: número de móvil
(int), nombre del cliente (String), segundos consumidos (int) y precio por segundo (double).
Implemente además:
- Una variable privada de clase que cuente la cantidad de objetos tipo Movil creados (int).
- Una variable privada de clase que acumule la suma de todos los importes a pagar
(double).
- Una constante pública de clase para el factor del IGV (double).
- Un bloque de inicialización static para asignarle a la constante el valor 0.18 e inicializar
con cero las variables privadas de clase.
- Un constructor que inicialice a todos los atributos, cuente la cantidad de objetos creados
y acumule los importes a pagar. Haga uso de la referencia this.
- Un constructor con dos parámetros que inicialice sólo los atributos número y nombre,
invocando al primer constructor usando la referencia this, enviando con el valor 75 los
segundos consumidos y con 0.28 el precio por segundo.
- Un constructor sin parámetros que invoque al segudo constructor usando la referencia
this, enviando con 987656789 el número de móvil y con “Juan” el nombre del cliente.
- Métodos de acceso público set para todos los atributos privados. Use de la referencia
this.
- Métodos de acceso público get para todos los atributos privados.
- Métodos públicos de clase set/get para las variables privadas de clase.
- Un método que retorne el costo por consumo (segundos * precio).
- Un método que retorne el impuesto por IGV (aplicado al costo por consumo).
- Un método que retorne el importe a pagar (costo por consumo + impuesto por IGV).
Ejercicio Propuesto 4
Diseñe la clase Asesor en el paquete semana_03 con los atributos privados: nombre del asesor
(String), dni (int), codigo (int), y remuneración en dólares (double).
Implemente además:
- Una variable privada de clase que cuente la cantidad de objetos tipo Asesor creados
(int).
- Una variable privada de clase que acumule la suma de todas las remuneraciones
(double).
- Una constante pública de clase para el nombre de la institución (String).
- Un bloque de inicialización static para asignarle a la constante el nombre de la
institución e inicializar con cero las variables privadas de clase.
- Un constructor que inicialice a todos los atributos, cuente la cantidad de objetos creados
y acumule todas las remuneraciones. Haga uso de la referencia this.
- Un constructor con dos parámetros que inicialice sólo los atributos nombre y dni,
invocando al primer constructor usando la referencia this, enviando con el valor 55555
el código y con 2000.0 la remuneración en dólares.
- Un constructor sin parámetros que invoque al segudo constructor usando la referencia
this, enviando con “NN” el nombre del asesor y con 88888888 el número del dni.
- Métodos de acceso público set para todos los atributos privados. Use de la referencia
this.
- Métodos de acceso público get para todos los atributos privados.
- Métodos públicos de clase set/get para las variables privadas de clase.
Ejercicio Propuesto 5
Diseñe la clase Balon en el paquete semana_03 con los atributos privados: marca (String), peso
en gramos (double), presión en libras (double), diámetro en centímetros (double) y precio
(double).
Implemente además:
- Una variable privada de clase que cuente la cantidad de objetos tipo Balon creados (int).
- Una variable privada de clase que acumule los importes a pagar (double).
- Una constante pública de clase para el valor de PI (double) y otra para el factor de
descuento (double).
Ejercicio Propuesto 6
Diseñe la clase Consultor en el paquete semana_03 con los atributos privados: codigo (int),
nombre (String), horas trabajadas (int) y tarifa por hora (double).
Implemente además:
- Una variable privada de clase que cuente la cantidad de objetos tipo Consultor creados
(int).
- Una variable privada de clase que acumule los sueldos netos (double).
- Dos constantes públicas de clase para factores de descuentos por AFP y EPS (double).
- Un bloque de inicialización static para asignarle a la constante AFP el factor 0.10, a la
constante EPS el factor 0.05 e inicializar con cero las variables privadas de clase.
- Un constructor que inicialice a todos los atributos, cuente la cantidad de objetos creados
y acumule los sueldos netos. Haga uso de la referencia this.
- Un constructor con tres parámetros que inicialice sólo los atributos código, nombre y
horas trabajadas, invocando al primer constructor usando la referencia this, enviando
con el valor 65.0 la tarifa.
- Un constructor sin parámetros que invoque al segudo constructor usando la referencia
this, enviando con 333 el código, con “Juan” el nombre y con 30 las horas.
- Métodos de acceso público set para todos los atributos privados. Use la referencia this.
- Métodos de acceso público get para todos los atributos privados.
- Métodos públicos de clase set/get para las variables privadas de clase.
- Un método que retorne el sueldoBruto (horas*tarifa).
- Un método que retorne el descuentoAFP (aplicado al sueldo bruto).
- Un método que retorne el descuentoEPS (aplicado al sueldo bruto).
- Un método que retorne el sueldoNeto = (sueldoBruto – descuentoAFP – descuentoEPS).
1.4.1. Descripción
Una cadena de texto es un conjunto de caracteres dispuestos uno a continuación de otro, donde
cada carácter conserva su propio espacio (tamaño en bytes).
Ejemplo:
cadena ➔ ‘ ‘ ‘ ‘ ‘ ‘ ‘ ‘ ‘ ‘ ‘ ‘ ‘
J0 a 1 v 2a ’
3 e4 s 5 ’ 6m e7 j 8 o 9r 10
’ ’ ’ ’ ’ ’ ’ ’ ’ ’ ’
1.4.3. Concatenación
Se utiliza el símbolo más para acoplar información. Una variable cadena puede concatenar
textos, caracteres y números. Al final todo sigue siendo un String.
Ejemplo:
1.4.4. Recorrido
METODO DESCRIPCION
length() Devuelve la longitud de la cadena.
int longitud = cadena.length();
longitud 13
charAt(int) Devuelve una copia del carácter que encuentre en la posición
indicada por el parámetro.
char caracter = cadena.charAt(8);
caracter 'm'
equals(String) Comprueba si dos cadenas son iguales. En este caso comprueba que
el objeto dado como argumento sea de tipo String y contenga la
misma cadena de caracteres que el objeto actual.
String s = "Java";
boolean b = cadena.equals(s);
b false
compareTo(String) Devuelve un entero menor que cero si la cadena es alfabéticamente
menor que la dada como argumento, cero si las dos cadenas son
léxicamente iguales y un entero mayor que cero si la cadena es
mayor alfabéticamente.
String s1 = "Java es lo máximo",
s2 = "Java es mejor",
s3 = "Java es ok";
int i = cadena.compareTo(s1),
j = cadena.compareTo(s2),
k = cadena.compareTo(s3);
i 1 // cadena mayor que s1 alfabéticamente
j 0 // cadena contiene lo mismo que s2
k -2 // cadena menor que s3 alfabéticamente
equalsIgnoreCase(String) Realiza la misma tarea que equals pero sin tener en cuenta las
mayúsculas o minúsculas.
String s = "Java es mejor";
boolean b = cadena.equalsIgnoreCase(s);
b true
startsWith(String) Comprueba si el comienzo de la cadena actual coincide con la cadena
pasada como parámetro.
String s = "JavvaX";
boolean b = cadena.startsWith(s);
b false
endsWith(String) Comprueba si el final de la cadena actual coincide con la cadena
pasada como parámetro.
String s = "mejor";
boolean b = cadena.endsWith(s);
b true
indexOf(char) Devuelve la posición que por primera vez aparece el carácter
(expresado como entero) pasado como parámetro. En caso no exista
devuelve -1.
int i = cadena.indexOf('e');
i 5
indexOf(char, int) Devuelve la posición que por primera vez aparece el carácter
(expresado como entero) a partir de la posición especificada como
segundo parámetro.
int i = cadena.indexOf('e', 6);
i 9
indexOf(String) Devuelve la posición que por primera vez aparece la cadena pasada
como parámetro.
int i = cadena.indexOf("va");
i 2
indexOf(String, int) Devuelve la posición que por primera vez aparece la cadena pasada
como parámetro, pudiendo especificar en un segundo parámetro a
partir de dónde buscar.
int i = cadena.indexOf("ej", 5);
i 9
lastIndexOf(char) Devuelve la última vez que aparece el carácter (expresado como
entero) o cadena pasada como parámetro, pudiendo especificar en
lastIndexOf(char, int)
un segundo parámetro, a partir de dónde buscar (búsqueda hacia
lastIndexOf(String) atrás).
lastIndexOf(String, int) String s = "e";
int i = cadena.lastIndexOf(s);
i 9
replace(char, char) Reemplaza todos los caracteres iguales al primer parámetro y los
sustituye por el carácter que pasamos en segundo lugar, teniendo en
cuenta lo mismo una mayúscula que una minúscula.
String s = "biba el Perú";
s = s.replace('b', 'v');
s "viva el Perú"
String.valueOf(boolean)
String.valueOf(int)
String.valueOf(long) double r = 3.1416;
String.valueOf(float) String s = String.valueOf(r);
String.valueOf(double) s "3.1416"
String.valueOf(Object)
String.valueOf(char[])
String.valueOf(char[],int, int) Transforma una subcadena de un arreglo de caracteres, especificando
una posición y la longitud.
char[] c = { 'C','i','b','e','r','J','a','v','a' };
String s = String.valueOf(c, 3, 5);
s "erJav"
package libreria;
num /= 1000;
if (num > 0)
if (x == 2)
cad = "1" + cad;
else
if (x == 4)
cad = "2" + cad;
else
if (x == 6)
cad = "3" + cad;
else
cad = "," + cad;
}
return cad;
}
switch(millar) {
case 1: mm = "M"; break;
case 2: mm = "MM"; break;
case 3: mm = "MMM"; break;
}
switch(centena) {
case 1: cc = "C"; break;
case 2: cc = "CC"; break;
case 3: cc = "CCC"; break;
case 4: cc = "CD"; break;
case 5: cc = "D"; break;
case 6: cc = "DC"; break;
case 7: cc = "DCC"; break;
case 8: cc = "DCCC"; break;
case 9: cc = "CM"; break;
}
switch(decena) {
case 1: dd = "X"; break;
case 2: dd = "XX"; break;
case 3: dd = "XXX"; break;
case 4: dd = "XL"; break;
case 5: dd = "L"; break;
case 6: dd = "LX"; break;
case 7: dd = "LXX"; break;
case 8: dd = "LXXX"; break;
case 9: dd = "XC"; break;
}
switch(unidad) {
case 1: uu = "I"; break;
case 2: uu = "II"; break;
case 3: uu = "III"; break;
case 4: uu = "IV"; break;
case 5: uu = "V"; break;
case 6: uu = "VI"; break;
case 7: uu = "VII"; break;
case 8: uu = "VIII"; break;
case 9: uu = "IX"; break;
}
return mm + cc + dd + uu;
} else
return "fuera de rango";
}
switch(x) {
case 2:
case 4:
case 6:
case 8: if (n > 0)
c = " mil";
break;
case 3: if (num%1000000 > 0)
if (num == 1)
c = " millón";
else
c = " millones";
break;
case 5: if (num%1000000 > 0)
if (num == 1)
c = " billón";
else
c = " billones";
break;
case 7: if (num == 1)
c = " trillón";
else
c = " trillones";
break;
}
if (x == 1 && num%10 == 1)
cad += "o";
num /= 1000;
return cad;
}
cc = "";
switch(centena) {
case 1: cc = "cien";
if (decena != 0 || unidad != 0)
cc += "to"; break;
case 2: cc = "doscientos"; break;
case 3: cc = "trescientos"; break;
case 4: cc = "cuatrocientos"; break;
case 5: cc = "quinientos"; break;
case 6: cc = "seiscientos"; break;
dd = "";
switch(decena) {
case 1: switch(unidad) {
case 0: dd = "diez"; break;
case 1: dd = "once"; break;
case 2: dd = "doce"; break;
case 3: dd = "trece"; break;
case 4: dd = "catorce"; break;
case 5: dd = "quince"; break;
default: dd = "dieci";
} break;
case 2: dd = "veint";
if (unidad == 0)
dd += "e";
else
dd += "i"; break;
case 3: dd = "treint"; break;
case 4: dd = "cuarent"; break;
case 5: dd = "cincuent"; break;
case 6: dd = "sesent"; break;
case 7: dd = "setent"; break;
case 8: dd = "ochent"; break;
case 9: dd = "novent"; break;
}
if (decena > 2) {
dd += "a";
if (unidad > 0)
dd += " y ";
}
uu = "";
if (decena != 1 || unidad > 5)
switch(unidad) {
case 1: uu = "un"; break;
case 2: uu = "dos"; break;
case 3: uu = "tres"; break;
case 4: uu = "cuatro"; break;
case 5: uu = "cinco"; break;
case 6: uu = "seis"; break;
case 7: uu = "siete"; break;
case 8: uu = "ocho"; break;
case 9: uu = "nueve"; break;
}
package gui;
import libreria.Formato;
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Conversiones frame = new Conversiones();
frame.setVisible(true);
}
catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Conversiones() {
setResizable(false);
setTitle("Conversiones");
setIconImage(new ImageIcon("imagenes/PrimaTaxi.png").getImage());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(1000, 370);
this.setLocationRelativeTo(null);
procesar();
}
long enteroExtenso;
enteroExtenso = aleatorio(0, 8999999999999999999L);
imprimir("Entero extenso: " + enteroExtenso + "\t" +
"Estilo: " + Formato.estilo(enteroExtenso));
imprimir(Formato.texto(enteroExtenso));
imprimir("");
double real;
real = aleatorio(0, 89999999999L) / 10000.0;
imprimir("Real: " + real + "\t" + "Estilo: " +
Formato.estilo(real));
imprimir(Formato.texto(real));
imprimir("");
double realExtenso;
realExtenso = aleatorio(0, 8999999999999999999L) / 10000.0;
imprimir("Real extenso: " + realExtenso + "\t" + "Estilo: " +
Formato.estilo(realExtenso));
imprimir(Formato.texto(realExtenso));
}
void imprimir() {
txtS.append("");
}
UNIDAD
2
ARREGLO LINEAL
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, los alumnos manipulan arreglos lineales con tipos de datos
primitivos.
TEMARIO
2.1. Tema 5 : Conceptos y operaciones simples
2.1.1 : Descripción
2.1.2 : Declaración e inicialización
2.1.3 : Declaración privada e inicialización
2.1.4 : Recorrido
2.1.5 : Remplazo
2.1.6 : Operaciones públicas básicas
2.1.7 : Operaciones públicas complementarias
2.2. Tema 6 : Artificios y operaciones variadas
2.2.1 : Descripción
2.2.2 : Declaración, creación y reserva
2.2.3 : Declaración privada, creación y reserva
2.2.4 : Ingreso personalizado
2.2.5 : Recorrido
2.2.6 : Redimensionamiento
2.2.7 : Método privado ampliarArreglo
2.2.8 : Operaciones públicas básicas
2.2.9 : Operaciones públicas complementarias
2.3. Tema 7 : Artificios y operaciones especiales
2.3.1 : Método privado Buscar
2.3.2 : Método privado Intercambiar
2.3.3 : Operaciones públicas complementarias
Evaluación Laboratorio EL2
2.4. Tema 8 : Artificios complementarios
2.4.1 : Método privado Eliminar
2.4.2 : Método privado Insertar
2.4.3 : Operaciones públicas complementarias
ACTIVIDADES PROPUESTAS
• Reconocer un arreglo lineal.
• Emplear arreglos lineales en diversas aplicaciones.
2.1.1. Descripción
Un arreglo permite almacenar diferentes valores pero del mismo tipo de dato.
Con la declaración sólo se define la variable que hace referencia al arreglo y su contenido es null.
Se puede inicializar un arreglo directamente siempre y cuando se haga al momento de su
declaración.
Los símbolos [ ] indican a Java que la variable es de tipo arreglo lineal. Es decir que representa a
un conjunto de datos. Pueden adherirse al tipo de dato o la variable. Entre los símbolos { } y
separados por comas se indica los valores de asignación.
Gráficamente:
2.1.4. Recorrido
2.1.5. Remplazo
Consiste en modificar el contenido de un valor por otro valor. Se realiza a través de la posición.
Son aquellos métodos que permiten acceder al arreglo desde el exterior de la clase que lo
contiene.
Ejercicio 11: Implemente la clase Arreglo en el paquete semana_05 con el atributo privado:
- Arreglo lineal n de tipo int con los números asignados: 25, 27, 22, 24, 29, 20, 23
Implemente como públicos:
- Un constructor que no haga nada
- Un método público tamaño que retorne la capacidad máxima del arreglo n.
- Un método público obtener que reciba la posición y retorne el número registrado en dicha
posición.
- Un método público sumaNumeros que retorne la suma de los números.
- Un método público posPrimerNumeroMenorA25 que retorne la posión del primer número
menor a 25. En caso no exista retorne -1.
- Un método público generar que remplace los números actuales por otros aleatorios de 3
cifras.
- Un método privado aleatorio que reciba como parámetros los valores enteros mínimo y
máximo. Retorne luego un número al azar comprendido en ese intervalo cerrado.
package semana_05;
// Constructor
public Arreglo() { }
// Operaciones públicas
public int tamaño() {
return n.length;
}
return -1;
}
// Método privado
private int aleatorio(int min, int max) {
return (int)((max - min + 1) * Math.random()) + min;
}
}
Ejercicio 12: En el programa principal declare y cree como variable global un objeto de tipo
Arreglo y a la pulsación del botón respectivo:
- Visualice los números del arreglo.
- Muestre la capacidad máxima del arreglo, suma y promedio de los números.
- Remplace los números por otros aleatorios de tres cifras.
package gui;
import semana_05.Arreglo;
…
public class Ejemplo extends JFrame implements ActionListener {
// Declaración global
Arreglo a = new Arreglo();
…
protected void actionPerformedBtnListar(ActionEvent arg0) {
/*
* Visualiza los números del arreglo
*/
txtS.setText("");
for (int i=0; i<a.tamaño(); i++)
imprimir("n[" + i + "] : " + a.obtener(i));
}
Ejercicios
Ejercicio Propuesto 1
Diseñe la clase ArregloEdades en el paquete semana_05 con el atributo privado edad (int) de
tipo arreglo lineal y con los valores de inicialización:
27, 22, 13, 12, 25, 11, 29, 70, 15, 20
Implemente además:
- Un Constructor que no haga nada.
- Un método tamaño que retorne la cantidad de elementos del arreglo edad.
- Un método obtener que reciba una posición y retorne la edad registrada en dicha
posición.
- Un método edadPromedio que retorne el promedio de todas las edades.
- Un método edadMayor que retorne la mayor de todas las edades.
- Un método edadMenor que retorne la menor de todas las edades.
- Un método cantMayoresEdad que retorne la cantidad de personas mayores de edad.
- Un método cantMenoresEdad que retorne la cantidad de personas menores de edad.
- Un método buscarPrimeraEdadAdolescente que retorne la posición de la primera edad
encontrada en el rango de 12 a 20 años. En caso no exista retorne -1.
- Un método buscarUltimaEdadAdolescente que retorne la posición de la última edad
encontrada en el rango de 12 a 20 años. En caso no exista retorne -1.
- Un método generarEdades que remplace las edades actuales por otras aleatorias
comprendidas en el rango de 10 a 90 años.
- Haga uso del método:
private int aleatorio(int min, int max) {
return (int)((max - min + 1) * Math.random()) + min;
}
En la clase principal:
- Declare y cree el objeto global ae de tipo ArregloEdades.
- A la pulsación del botón Listar visualice las edades del arreglo.
- A la pulsación del botón Reportar visualice: cantidad de edades, edad promedio, edad
mayor, edad menor, cantidad de personas mayores de edad, cantidad de personas
menores de edad, posición de la primera edad adolescente y posición de la última edad
adolescente.
- A la pulsación del botón Generar invoque al método generarEdades.
Ejercicio Propuesto 2
Diseñe la clase ArregloNotas en el paquete semana_05 con el atributo privado nota (int) de tipo
arreglo lineal y con los valores de inicialización:
11, 10, 16, 18, 15, 13, 20, 12, 19, 17
Implemente además:
- Un Constructor que no haga nada.
- Un método tamaño que retorne la cantidad de elementos del arreglo nota.
- Un método obtener que reciba una posición y retorne la nota registrada en dicha
posición.
- Un método notaPromedio que retorne el promedio de todas las notas.
- Un método notaMayor que retorne la mayor de todas las notas.
- Un método notaMenor que retorne la menor de todas las notas.
En la clase principal:
- Declare y cree el objeto global an de tipo ArregloNotas.
- A la pulsación del botón Listar visualice las notas del arreglo.
- A la pulsación del botón Reportar visualice: cantidad de notas, nota promedio, nota
mayor, nota menor, cantidad de notas aprobatorias, cantidad de notas desaprobatorias,
cantidad de notas mayores a 15, posición de la primera nota mayor o igual a 13 y
posición de la última nota menor a 13.
- A la pulsación del botón Generar invoque al método generarNotas.
Ejercicio Propuesto 3
Diseñe la clase ArregloSueldos en el paquete semana_05 con el atributo privado sueldo (double)
de tipo arreglo lineal y con los valores de inicialización:
2400.5, 1500.2, 800.4, 1000.3, 4700.1, 600.0, 3300.8, 2600.6, 5100.9, 2000.7
Implemente además:
- Un Constructor que no haga nada.
- Un método tamaño que retorne la cantidad de elementos del arreglo sueldo.
- Un método obtener que reciba una posición y retorne el sueldo registrado en dicha
posición.
- Un método sueldoPromedio que retorne el promedio de todos los sueldos.
- Un método sueldoMayor que retorne el mayor de todos los sueldos.
- Un método sueldoMenor que retorne el menor de todos los sueldos.
- Un método cantMayoresSueldoPromedio que retorne la cantidad de empleados cuyo
sueldo es mayor o igual al sueldo promedio.
- Un método cantMenoresSueldoPromedio que retorne la cantidad de empleados cuyo
sueldo es menor al sueldo promedio.
- Un método buscarPrimerSueldoMayorAlMinimo que retorne la posición del primer
sueldo mayor a 850.0. En caso no exista retorne -1.
- Un método buscarUltimoSueldoMenorAlMinimo que retorne la posición del último
sueldo menor a 850.0. En caso no exista retorne -1.
En la clase principal:
- Declare y cree el objeto global as de tipo ArregloSueldos.
- A la pulsación del botón Listar visualice los sueldos del arreglo.
- A la pulsación del botón Reportar visualice: cantidad de sueldos, sueldo promedio,
sueldo mayor, sueldo menor, cantidad de empleados cuyo sueldo es mayor o igual al
sueldo promedio, cantidad de empleados cuyo sueldo es menor al sueldo promedio,
posición del primer sueldo mayor a 850.0 y posición del último sueldo menor a 850.0.
2.2.1. Descripción
Es posible también crear un arreglo reservando una cierta cantidad de espacios antes de ingresar
valores. Se usa para tener la facilidad de adicionar uno por uno los valores y en diferentes
tiempos. Además, hace posible definir la dimensión del arreglo en tiempo de ejecución del
programa.
Cuando se crea un arreglo con reserva Java inicializa por defecto cada valor: con 0 si es de tipo
entero, 0.0 si es de tipo real, null si es de tipo cadena, vacío si es de tipo caracter y false si es de
tipo booleano.
Observación: para efectos visuales y con la finalidad de evitar confusión no colocaremos los
valores de inicialización.
Con la reserva le indicamos a Java la cantidad de elementos que va a tener el arreglo (tamaño
del bloque de elementos) y la variable que hace referencia al arreglo almacena la dirección del
primer elemento del arreglo.
Para ingresar valores personalizados es necesario considerar un contador (indice) de tal manera
que sirva como guía para saber dónde ubicar al nuevo valor.
El contador indice nos dice que hay tres números ingresados: n[0], n[1] y n[2]
2.2.5. Recorrido
2.2.6. Redimensionamiento
Son aquellos métodos que permiten acceder a los elementos resgistrados desde el exterior de
la clase que lo contiene.
Ejercicio 13: Diseñe un algoritmo que retorne el último número del arreglo.
Ejercicio 14: Diseñe un algoritmo que retorne la suma de los números ingresados hasta ese
momento.
return suma;
}
Ejercicio 15: Diseñe un algoritmo que retorne el promedio de los números ingresados hasta
ese momento.
Ejercicios
Ejercicio Propuesto 1
Diseñe la clase ArregloEdades en el paquete semana_06 con el atributo privado edad (int) de
tipo arreglo lineal y el atributo privado indice (int).
Implemente además:
- Un Constructor sin parámetros que reserve 10 espacios en edad e inicialice con 0 al
indice.
- Un método tamaño que retorne la cantidad de datos ingresados hasta ese momento.
- Un método obtener que reciba una posición y retorne la edad registrada en dicha
posición.
- Un método privado ampliarArreglo que extienda el arreglo en diez espacios más.
- Un método adicionar que reciba una edad y la registre en la posición que corresponda.
Verifique primero si el arreglo está lleno para invocar al método ampliarArreglo.
- Un método eliminarAlFinal que elimina lógicamente la última edad del arreglo.
- Un método eliminarTodo que elimina lógicamente todas las edades.
- Un método edadMayor que retorne la mayor de todas las edades.
- Un método buscarPrimeraEdadAdulta que retorne la posición de la primera edad
encontrada en el rango de 20 a 59 años. En caso no exista retorne -1.
- Un método incrementarPrimeraEdadAdulta que aumente la primera edad adulta en 5
años.
- Un método remplazarPrimeraEdadAdulta que cambie la primera edad adulta por la
edad mayor.
En la clase principal:
- Declare y cree el objeto global ae de tipo ArregloEdades.
- Implemente un método listar que visualice las edades registradas hasta ese momento.
- A la pulsación del botón Adicionar lea una edad por GUI y adiciónela al arreglo. Invoque
luego al método listar.
- A la pulsación del botón Eliminar al final invoque al método eliminarAlFinal e invoque
al método listar. En caso que el arreglo esté vacío muestre el mensaje respectivo.
- A la pulsación del botón Eliminar todo invoque al método eliminarTodo. En caso que el
arreglo esté vacío muestre el mensaje respectivo.
- A la pulsación del botón Incrementar primera edad adulta invoque al método
incrementarPrimeraEdadAdulta. En caso que no exista ninguna edad adulta visualice
un mensaje al respecto.
- A la pulsación del botón Remplazar primera edad adulta invoque al método
remplazarPrimeraEdadAdulta. En caso que no exista ninguna edad adulta visualice un
mensaje al respecto.
Ejercicio Propuesto 2
Diseñe la clase ArregloNotas en el paquete semana_06 con el atributo privado nota (int) de tipo
arreglo lineal y el atributo privado indice (int).
Implemente además:
- Un Constructor sin parámetros que reserve 10 espacios en nota e inicialice con 0 al
indice.
- Un método tamaño que retorne la cantidad de datos ingresados hasta ese momento.
- Un método obtener que reciba una posición y retorne la nota registrada en dicha
posición.
- Un método privado ampliarArreglo que extienda el arreglo en diez espacios más.
- Un método adicionar que reciba una nota y la registre en la posición que corresponda.
Verifique primero si el arreglo está lleno para invocar al método ampliarArreglo.
- Un método eliminarAlFinal que elimina lógicamente la última nota del arreglo.
- Un método eliminarTodo que elimina lógicamente todas las notas.
- Un método buscarUltimaNotaDesaprobatoria que retorne la posición de la última nota
menor que 13. En caso no exista retorne -1.
- Un método decrementarUltimaNotaDesaprobatoria que disminuya la última nota
menor que 13 en dos puntos. En caso que al disminuir resulte una nota negativa, fije la
nota en cero.
- Un método remplazarUltimaNotaDesaprobatoria que cambie la última nota
desaprobatoria por la última nota del arreglo.
En la clase principal:
- Declare y cree el objeto global an de tipo ArregloNotas.
- Implemente un método listar que visualice las notas registradas hasta ese momento.
- A la pulsación del botón Adicionar lea una nota por GUI y adiciónela al arreglo. Invoque
luego al método listar.
- A la pulsación del botón Eliminar al final invoque al método eliminarAlFinal e invoque
al método listar. En caso que el arreglo esté vacío muestre el mensaje respectivo.
- A la pulsación del botón Eliminar todo invoque al método eliminarTodo. En caso que el
arreglo esté vacío muestre el mensaje respectivo.
- A la pulsación del botón Decrementar última nota desaprobatoria invoque al método
decrementarUltimaNotaDesaprobatoria. En caso que no exista ninguna nota
desaprobatoria visualice un mensaje al respecto.
- A la pulsación del botón Remplazar última nota desaprobatoria invoque al método
remplazarUltimaNotaDesaprobatoria. En caso que no exista nota desaprobatoria
visualice un mensaje al respecto.
Ejercicio Propuesto 3
Diseñe la clase ArregloTemperaturas en el paquete semana_06 con el atributo privado
temperatura (double) de tipo arreglo lineal y el atributo privado indice (int).
Implemente además:
- Un Constructor sin parámetros que reserve 10 espacios en temperatura e inicialice con
0 al indice.
- Un método tamaño que retorne la cantidad de datos ingresados hasta ese momento.
- Un método obtener que reciba una posición y retorne la temperatura registrada en
dicha posición.
- Un método privado ampliarArreglo que extienda el arreglo en diez espacios más.
- Un método adicionar que reciba una temperatura y la registre en la posición que
corresponda. Verifique primero si el arreglo está lleno para invocar al método
ampliarArreglo.
- Un método eliminarAlFinal que elimina lógicamente la última temperatura del arreglo.
- Un método eliminarTodo que elimina lógicamente todas las temperaturas.
- Un método temperaturaMenor que tetorne la emperatura más baja.
- Un método buscarPrimeraTemperaturaNormal que retorne la posición de la primera
temperatura encontrada en el rango de 36.1°C a 37.2°C.
En la clase principal:
- Declare y cree el objeto global at de tipo ArregloTemperaturas.
- Implemente un método listar que visualice las temperaturas registradas hasta ese
momento.
- A la pulsación del botón Adicionar lea una temperatura por GUI y adiciónela al arreglo.
Invoque luego al método listar.
- A la pulsación del botón Eliminar al final invoque al método eliminarAlFinal e invoque
al método listar. En caso que el arreglo estè vacío muestre el mensaje respectivo.
- A la pulsación del botón Eliminar todo invoque al método eliminarTodo. En caso que el
arreglo esté vacío muestre el mensaje respectivo.
- A la pulsación del botón Remplazar primera temperatura normal invoque al método
remplazarPrimeraTemperaturaNormal. Visualice los cambios. En caso que no exista
ninguna temperatura normal visualice un mensaje al respecto.
- A la pulsación del botón Incrementar temperaturas invoque al método
incrementarTemperaturas. Visualice los cambios.
Consiste en cambiar de lugar a dos contenidos del arreglo. Para ello debemos definir las
posiciones y apoyarnos en una variable auxiliar.
Ejercicio 23: Adicione un número (recibido) de tal manera que el arreglo siempre quede
ordenado de menor a mayor.
Ejercicio 24: Busque un número (recibido), y si no está registrado adiciónelo de tal manera que
el arreglo siempre quede ordenado de menor a mayor.
Recibe una posición y elimina del arreglo el valor ubicado en dicha posición.
Ejercicio 26: Busque un número (recibido) y si está registrado intercámbielo con el último
número del arreglo.
Ejercicios
Ejercicio Propuesto 1
Dada la implementación de la clase ArregloEdades en el paquete semana_08 adicione:
- Un método buscarPrimeraEdadAdolescente que retorne la posición de la primera edad
adolescente (edad en el rango de 12 a 20 años). En caso que no exista, retorne el valor -1.
- Un método buscarUltimaEdadAdolescente que retorne la posición de la última edad
adolescente (edad en el rango de 12 a 20 años). En caso que no exista, retorne el valor -1.
- Un método remplazarPrimeraEdadAdolescente que remplace la primera edad adolescente
por la última edad.
- Un método intercambiarEdadesAdolescentesExtremas que intercambie la primera edad
adolescente con la última edad adolescente.
- Un método eliminarPrimeraEdadAdolescente que elimine la primera edad adolescente.
En la clase principal:
- A la pulsación del botón Remplazar primera edad adolescente, invoque al método
remplazarPrimeraEdadAdolescente y visualice un listado actualizado de edades. En caso
que el remplazo no sea posible, muestre un mensaje al respecto.
- A la pulsación del botón Intercambiar edades adolescentes extremas invoque al método
intercambiarEdadesAdolescentesExtremas y visualice un listado actualizado de edades. En
caso que el intercambio no sea posible, muestre un mensaje al respecto.
- A la pulsación del botón Eliminar primera edad adolescente invoque al método
eliminarPrimeraEdadAdolescente y visualice un listado actualizado de edades. En caso que
la eliminación no sea posible, muestre un mensaje al respecto.
Ejercicio Propuesto 2
Dada la implementación de la clase ArregloNotas en el paquete semana_08 adicione:
- Un método notaMenor que retorne la menor de todas las notas.
- Un método buscarPrimeraNotaAprobatoria que retorne la posición de la primera nota
aprobatoria (nota en el rango de 13 a 20). En caso que no exista, retorne -1.
- Un método buscarUltimaNotaAprobatoria que retorne la posición de la última nota
aprobatoria (nota en el rango de 13 a 20). En caso que no exista, retorne -1.
- Un método remplazarUltimaNotaAprobatoria que remplace la última nota aprobatoria por
la nota menor.
- Un método eliminarPrimeraNotaAprobatoria que elimine la primera nota aprobatoria.
En la clase principal:
- A la pulsación del botón Remplazar última nota aprobatoria, invoque al método
remplazarUltimaNotaAprobatoria y visualice un listado actualizado de notas. En caso que
el reemplazo no sea posible, muestre un mensaje al respecto.
- A la pulsación del botón Eliminar primera nota aprobatoria invoque al método
eliminarPrimeraNotaAprobatoria y visualice un listado actualizado de notas. En caso que
la eliminación no sea posible, muestre un mensaje al respecto.
Ejercicio Propuesto 3
Dada la implementación de la clase ArregloTemperaturas en el paquete semana_08 adicione:
- Un método temperaturaPromedio que retorne el promedio de todas las temperaturas.
- Un método buscarPrimeraTemperaturaFebril que retorne la posición de la primera
temperatura febril (temperatura mayor que 37.2 oC). En caso que no exista, retorne el valor
-1.
En la clase principal:
- A la pulsación del botón Remplazar primera temperatura febril, invoque al método
remplazarPrimeraTemperaturaFebril y visualice un listado actualizado de temperaturas.
En caso que el remplazo no sea posible, muestre un mensaje al respecto.
- A la pulsación del botón Reemplazar última temperatura febril, invoque al método
remplazarUltimaTemperaturaFebril y visualice un listado actualizado de temperaturas. En
caso que el remplazo no sea posible, muestre un mensaje al respecto.
- A la pulsación del botón Eliminar primera temperatura febril invoque al método
eliminarPrimeraTemperaturaFebril y visualice un listado actualizado de temperaturas. En
caso que la eliminación no sea posible, muestre un mensaje al respecto.
Ejercicio Propuesto 4
Diseñe la clase ArregloCodigos en el paquete semana_08 con el atributo privado codigo (int) de
tipo arreglo lineal y el atributo privado indice (int).
Implemente además:
- Un Constructor sin parámetros que reserve 10 espacios en codigo e inicialice con 0 al indice.
- Un método tamaño que retorne la cantidad de datos ingresados hasta ese momento.
- Un método obtener que reciba una posición y retorne el código registrado en dicha
posición.
- Un método privado ampliarArreglo que extienda el arreglo en diez espacios más.
- Un método adicionar que reciba un código y lo registre en la posición que corresponda.
Verifique primero si el arreglo está lleno para invocar al método ampliarArreglo.
- Un método intercambiarSegPen que cambie de lugar al segundo y penúltimo código del
arreglo.
- Un método eliminarPrimero que retire el primer código del arreglo.
- Un método buscarCodigo que retorne la posición del último código que se encuentre en el
rango de 1000 a 1111. En caso no exista retorne -1.
- Un método intercambiarCodigo que cambie de lugar al último código que se encuentre en
el rango de 1000 a 1111 con el tercer código del arreglo.
- Un método eliminarCodigo que retire del arreglo al último código que se encuentre en el
rango de 1000 a 1111.
En la clase principal:
- Declare y cree el objeto global ac de tipo ArregloCodigos.
- Implemente un método listar que visualice los códigos registrados hasta ese momento.
- A la pulsación del botón Adicionar lea un código por GUI y adiciónelo al arreglo. Invoque
luego al método listar.
- A la pulsación del botón Intercambiar 1 invoque al método intercambiarSegPen e invoque
al método listar. En caso de que no sea posible muestre el mensaje respectivo.
- A la pulsación del botón Eliminar 1 invoque al método eliminarPrimero. En caso que el
arreglo esté vacío muestre el mensaje respectivo.
UNIDAD
3
CLASE ARRAYLIST
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, los alumnos utilizan los métodos de la clase ArrayList para efectuar
operaciones con objetos (ingresar, consultar, eliminar, modificar, listar entre otras).
TEMARIO
3.1. Tema 9 : Conceptos y operaciones simples
3.1.1 : Descripción
3.1.2 : Coleccionista de objetos distintos
3.1.3 : Coleccionista de objetos iguales
3.1.4 : Declaración privada y creación
3.1.5 : Métodos básicos de la clase ArrayList
3.1.6 : Operaciones públicas básicas
3.1.7 : Operaciones públicas complementarias
ACTIVIDADES PROPUESTAS
3.1.1. Descripción
La clase ArrayList implementada por Java permite manipular una colección de objetos. Su diseño
híbrido le permite comportarse como arreglo (Array) o como lista (List). Internamente todo es
dinámico.
La Clase ArrayList inicializa por defecto un arreglo con capacidad inicial para diez direcciones de
memoria. Al comienzo todas las posiciones apuntan a null.
Define también un guía (int) que apunta a la posición cero. Cuando requiera mayor capacidad
ampliará el arreglo en diez espaciamientos más, y así sucesivamente.
import java.util.ArrayList;
Forma 1
ArrayList coleccionista;
…
coleccionista = new ArrayList();
Forma 2
ArrayList coleccionista = new ArrayList();
La clase ArrayList puede comportarse como un coleccionista de objetos iguales. En ese caso
debemos colocar el nombre de una Clase entre los signos < >
Forma 1
Forma 2
package clase;
// Constructor
public Alumno(int codigo, String nombre, int nota1, int nota2) {
this.codigo = codigo;
this.nombre = nombre;
this.nota1 = nota1;
this.nota2 = nota2;
}
// Operaciones públicas
public double promedio() {
return (nota1 + nota2) / 2.0;
}
}
Son los métodos que permiten acceder al ArrayList desde el exterior de la clase que lo
implementa.
package arreglo;
import clase.Alumno;
import java.util.ArrayList;
// Constructor
public ArregloAlumnos() {
alu = new ArrayList <Alumno> ();
alu.add(new Alumno(123, "Ana", 19, 17));
alu.add(new Alumno(456, "Juan", 15, 14));
alu.add(new Alumno(789, "Pedro", 19, 15));
alu.add(new Alumno(302, "David", 13, 18));
}
Ejercicio 28: En el programa principal declare y cree como variable global un objeto de tipo
ArregloAlumnos y a la pulsación del botón respectivo:
package gui;
import arreglo.ArregloAlumnos;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Ejemplo frame = new Ejemplo();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Ejemplo() {
setTitle("Ejemplo - Semana_09");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 430, 500);
if (arg0.getSource() == btnListar) {
actionPerformedBtnListar(arg0);
}
}
// Declaración global
ArregloAlumnos aa = new ArregloAlumnos();
modelo.addRow(fila);
}
}
Ejercicios
Ejercicio Propuesto 1
Dada la implementación de la clase ArregloAlumnos en el paquete arreglo
package arreglo;
import clase.Alumno;
import java.util.ArrayList;
// Constructor
public ArregloAlumnos() {
alu = new ArrayList <Alumno> ();
alu.add(new Alumno(123, "Ana", 19, 17));
alu.add(new Alumno(456, "Juan", 15, 14));
alu.add(new Alumno(789, "Pedro", 19, 15));
alu.add(new Alumno(302, "David", 13, 18));
alu.add(new Alumno(208, "Carlos", 20, 19));
alu.add(new Alumno(417, "Jorge", 12, 13));
alu.add(new Alumno(208, "María", 15, 17));
alu.add(new Alumno(820, "José", 11, 10));
}
En la clase principal:
- Considere la declaración global ArregloAlumnos aa = new ArregloAlumnos();
- Implemente la pulsación del botón Listar que muestre los datos completos de cada
alumno.
- Implemente la pulsación del botón Reportar que muestre los retornos de los métodos
complementarios.
Ejercicio Propuesto 2
Implemente la clase Docente en el paquete clase con los atributos privados: código (int),
nombre (String), horas (int) y tarifa (double); un constructor que inicialice los atributos privados,
los métodos de acceso público set/get y el método sueldo (horas * tarifa).
Métodos básicos
- Un constructor que cree el ArrayList y adicione las DirMem de ocho objetos Docente.
- Método tamaño que retorne la cantidad de objetos Docente registrados hasta ese
momento.
- Método obtener que reciba una posición y retorne la DirMem del objeto Docente
respectivo.
Métodos complementarios
- Retorne el sueldo promedio.
- Retorne el sueldo mayor.
- Retorne el sueldo menor.
- Retorne la tarifa mayor.
- Retorne la tarifa menor.
En la clase principal:
- Considere la declaración global ArregloDocentes ad = new ArregloDocentes();
- Implemente la pulsación del botón Listar que muestre los datos completos de cada
docente.
- Implemente la pulsación del botón Reportar que muestre los retornos de los métodos
complementarios.
Ejercicio Propuesto 3
Implemente la clase Factura en el paquete clase con los atributos privados: ruc (String), empresa
(String), unidades (int) y precio unitario (double); un constructor que inicialice los atributos
privados, los métodos de acceso público set/get y el método importeFacturado (unidades *
precio unitario).
Implemente la clase ArregloFacturas en el paquete arreglo con el atributo privado fac (ArrayList
de tipo Factrura) e implemente:
Métodos básicos
- Un constructor que cree el ArrayList y adicione las DirMem de ocho objetos Factura.
- Método tamaño que retorne la cantidad de objetos Factura registrados hasta ese
momento.
- Método obtener que reciba una posición y retorne la DirMem del objeto Factura
respectivo.
Métodos complementarios
- Retorne suma de todos los importes facturados.
- Retorne importe promedio facturado.
- Retorne menor importe facturado.
- Retorne mayor importe facturado.
- Retorne nombre de la primera empresa cuyo importe facturado sea menor al importe
promedio facturado.
En la clase principal:
- Considere la declaración global ArregloFacturas af = new ArregloFacturas();
- Implemente la pulsación del botón Listar que muestre los datos completos de cada
factura.
- Implemente la pulsación del botón Reportar que muestre los retornos de los métodos
complementarios.
package arreglo;
import clase.Alumno;
import java.util.ArrayList;
// Constructor
public ArregloAlumnos() {
alu = new ArrayList <Alumno> ();
alu.add(new Alumno(123, "Ana", 19, 17));
alu.add(new Alumno(456, "Juan", 15, 14));
alu.add(new Alumno(789, "Pedro", 19, 15));
alu.add(new Alumno(302, "David", 13, 18));
alu.add(new Alumno(208, "Carlos", 20, 19));
alu.add(new Alumno(417, "Jorge", 12, 13));
alu.add(new Alumno(208, "María", 15, 17));
alu.add(new Alumno(820, "José", 11, 10));
}
return null;
}
Ejercicio 30: En el programa principal declare y cree como variable global un objeto de tipo
ArregloAlumnos e implementa el método listar que visualice todos los alumnos ingresados.
- Adicionar : envíe al método adicionar un nuevo alumno creado, validando que el código
no se repita.
- Eliminar por código : busque un código y si existe retire el objeto del arreglo.
package gui;
import clase.Arreglo;
import arreglo.ArregloAlumnos;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JOptionPane;
import javax.swing.SwingConstants;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
/**
* Create the frame.
*/
public Ejemplo() {
setTitle("Ejemplo - Semana_10");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 630, 370);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
listar();
}
// Declaración global
ArregloAlumnos aa = new ArregloAlumnos();
void listar() {
modelo.setRowCount(0);
for (int i=0; i<aa.tamaño(); i++) {
Object fila[] = { aa.obtener(i).getCodigo(),
aa.obtener(i).getNombre(),
aa.obtener(i).getNota1(),
aa.obtener(i).getNota2(),
aa.obtener(i).promedio() };
modelo.addRow(fila);
}
}
int leerCodigo() {
return Integer.parseInt(txtCodigo.getText().trim());
}
String leerNombre() {
return txtNombre.getText().trim();
}
int leerNota1() {
return Integer.parseInt(txtNota1.getText().trim());
}
int leerNota2() {
return Integer.parseInt(txtNota2.getText().trim());
}
3.3. Mantenimiento
Ejercicio 31: Diseñe la clase Persona en el paquete clases con los atributos privados: codigo
(int), nombre (String), dni (String), peso (double), estatura (double) y estado (int).
Implemente además
- Un constructor que inicialice a todos los atributos.
- Métodos de acceso público set para todos los atributos privados. Use la referencia this.
- Métodos de acceso público get para todos los atributos privados.
- Método público que retorne el índice de masa corporal:
imc = peso / (estatura * estatura)
package clases;
// Constructor
public Persona(int codigo, String nombre, String dni,
double peso, double estatura, int estado) {
this.codigo = codigo;
this.nombre = nombre;
this.dni = dni;
this.peso = peso;
this.estatura = estatura;
this.estado = estado;
}
package arreglos;
import clases.Persona;
import java.util.ArrayList;
// Constructor
public ArregloPersonas () {
per = new ArrayList <Persona> ();
adicionar(new Persona(1001, "Juan Prado Salazar", "07557853", 82.3, 1.75, 3));
adicionar(new Persona(1002, "Pedro Romero Soto", "11002348", 79.5, 1.58, 1));
adicionar(new Persona(1003, "Luis Pinto Garza", "62279345", 82.7, 1.83, 0));
adicionar(new Persona(1004, "Daniel Rojas Saenz", "20977241", 80.2, 1.72, 2));
adicionar(new Persona(1005, "Jorge Espinal Vega", "06377845", 75.9, 1.88, 1));
}
return null;
}
Ejercicio 33: Diseñe en la clase principal DlgPersona una GUI adecuada para realizar las
operaciones básicas de todo proyecto: adicionar, consultar, modificar y eliminar. Realice las
validaciones de ingreso respectivas. Considere la declaración global ArregloPersonas ap = new
ArregloPersonas ();
package guis_1;
import clases.Persona;
import arreglos.ArregloPersonas;
import java.awt.EventQueue;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
DlgPersona dialog = new DlgPersona();
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the dialog.
*/
public DlgPersona() {
setResizable(false);
setTitle("Mantenimiento | Persona");
setBounds(100, 100, 800, 600);
getContentPane().setLayout(null);
ajustarAnchoColumnas();
listar();
}
// Declaración global
ArregloPersonas ap = new ArregloPersonas();
if (arg0.getSource() == btnVolver) {
actionPerformedBtnVolver(arg0);
}
if (arg0.getSource() == btnAceptar) {
actionPerformedBtnAceptar(arg0);
}
if (arg0.getSource() == btnEliminar) {
actionPerformedBtnEliminar(arg0);
}
if (arg0.getSource() == btnModificar) {
actionPerformedBtnModificar(arg0);
}
if (arg0.getSource() == btnConsultar) {
actionPerformedBtnConsultar(arg0);
}
if (arg0.getSource() == btnAdicionar) {
actionPerformedBtnAdicionar(arg0);
}
}
txtCodigo.setText("" + ap.codigoCorrelativo());
txtNombre.setText("");
txtDni.setText("");
txtPeso.setText("");
txtEstatura.setText("");
habilitarEntradas(true);
habilitarBotones(false);
txtNombre.requestFocus();
}
txtCodigo.setEditable(true);
habilitarBotones(false);
txtCodigo.requestFocus();
}
txtCodigo.setEditable(true);
habilitarEntradas(true);
habilitarBotones(false);
txtCodigo.requestFocus();
}
void listar() {
Persona x;
modelo.setRowCount(0);
for (int i=0; i<ap.tamaño(); i++) {
x = ap.obtener(i);
Object[] fila = {x.getCodigo(), x.getNombre(),
x.getDni(), x.getPeso(),
x.getEstatura(),
enTextoEstadoCivil(x.getEstado()),
x.imc() };
modelo.addRow(fila);
}
}
void consultarPersona() {
try {
Persona x = ap.buscar(leerCodigo());
if (x != null) {
txtNombre.setText(x.getNombre());
txtDni.setText(x.getDni());
txtPeso.setText("" + x.getPeso());
txtEstatura.setText("" + x.getEstatura());
cboEstadoCivil.setSelectedIndex(x.getEstado());
txtCodigo.requestFocus();
} else
error("El código " + leerCodigo() + " no existe", txtCodigo);
} catch (Exception e) {
error("Ingrese CÓDIGO correcto", txtCodigo);
}
}
void adicionarPersona() {
int codigo = leerCodigo();
String nombre = leerNombre();
if (nombre.length() > 0) {
String dni = leerDni();
if (ap.buscar(dni) == null)
try {
double peso = leerPeso();
try {
double estatura = leerEstatura();
int estado = leerPosEstado();
txtCodigo.setText("" + ap.codigoCorrelativo());
txtNombre.setText("");
txtDni.setText("");
txtPeso.setText("");
txtEstatura.setText("");
txtNombre.requestFocus();
} catch (Exception e) {
error("Ingrese ESTATURA correcta", txtEstatura);
}
} catch (Exception e) {
error("Ingrese PESO correcto", txtPeso);
}
else
error("Ingrese DNI correcto", txtDni);
} else
error("Ingrese NOMBRE correcto", txtNombre);
}
void eliminarPersona() {
try {
int codigo = leerCodigo();
Persona x = ap.buscar(codigo);
if (x != null) {
ap.eliminar(x);
listar();
txtCodigo.setText("");
txtNombre.setText("");
txtDni.setText("");
txtPeso.setText("");
txtEstatura.setText("");
txtCodigo.requestFocus();
} else
error("El código " + codigo + " no existe", txtCodigo);
} catch (Exception e) {
error("Ingrese CÓDIGO correcto", txtCodigo);
}
}
void modificarPersona() {
try {
Persona x = ap.buscar(leerCodigo());
String nombre = leerNombre();
if (nombre.length() > 0) {
String dni = leerDni();
Persona y = ap.buscar(dni);
if (y == null || x.equals(y))
try {
double peso = leerPeso();
try {
double estatura = leerEstatura();
int estado = leerPosEstado();
x.setNombre(nombre);
x.setDni(dni);
x.setPeso(peso);
x.setEstatura(estatura);
x.setEstado(estado);
listar();
txtCodigo.requestFocus();
} catch (Exception e) {
error("Ingrese ESTATURA correcta", txtEstatura);
}
} catch (Exception e) {
error("Ingrese PESO correcto", txtPeso);
}
else
error("Ingrese DNI correcto", txtDni);
} else
error("Ingrese NOMBRE correcto", txtNombre);
} catch (Exception e) {
error("Ingrese CÓDIGO correcto", txtCodigo);
}
}
btnAdicionar.setEnabled(sino);
btnConsultar.setEnabled(sino);
btnModificar.setEnabled(sino);
btnEliminar.setEnabled(sino);
if (tipoOperacion == CONSULTAR)
btnAceptar.setEnabled(false);
else
btnAceptar.setEnabled(!sino);
btnVolver.setEnabled(!sino);
}
void mensaje(String s) {
JOptionPane.showMessageDialog(this, s);
}
String leerNombre() {
return txtNombre.getText().trim();
}
String leerDni() {
return txtDni.getText().trim();
}
double leerPeso() {
return Double.parseDouble(txtPeso.getText().trim());
}
double leerEstatura() {
return Double.parseDouble(txtEstatura.getText().trim());
}
int leerPosEstado() {
return cboEstadoCivil.getSelectedIndex();
}
String enTextoEstadoCivil(int i) {
return cboEstadoCivil.getItemAt(i);
}
}
UNIDAD
4
TÉCNICAS AVANZADAS DE POO
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, los alumnos entienden el concepto de herencia y polimorfismo, la
relación de generalización/especialización entre clases e interfaces, se emplean las técnicas de
casting y clases abstractas en casos prácticos de herencia simple y múltiple.
TEMARIO
4.1. Tema 12 : Herencia y Polimorfismos
4.1.1 : Generalización / especialización
4.1.2 : Herencia
4.1.3 : Relación es-un o es-una
4.1.4 : Uso de super
4.1.5 : Sobrescritura de métodos
4.1.6 : Clases abstractas y métodos abstractos
4.1.7 : Técnicas de casting
4.1.8 : Polimorfismo y uso de “instanceof”
ACTIVIDADES PROPUESTAS
La generalización / especialización es la relación de una clase más general y una clase más
específica. La clase más específica se denomina clase hija o subclase y posee información
adicional mientras que la clase más general se denomina clase padre o superclase.
Las clases Hijo heredan características de la clase Padre y añaden características específicas que
las diferencian.
4.1.2. Herencia
Es el mecanismo mediante el cual se puede definir una clase (subclase) en base a otra clase
(superclase) heredando aquellos miembros de la superclase (atributos y métodos) que hayan
sido declarados como public, protected o sin especificador de acceso.
Una superclase declara un miembro como protected para permitir el acceso al miembro desde
el interior de sus subclases y desde una clase que se encuentre en el mismo paquete a la vez que
impide el acceso al miembro desde el exterior de la superclase.
un Mamífero es un Animal
un Ave es un Animal
una Vaca es un Mamífero
un Pato es un Ave
Si una clase no tiene una clase Padre explícita, entonces implícitamente su clase Padre es la clase
Object. Así, en el caso de la clase Animal, implícitamente figura como:
La clase Object define e implementa un comportamiento requerido por todas las clases dentro
del Sistema Java.
El Constructor de la clase Padre puede invocarse desde la clase Hijo utilizando la palabra super
de la siguiente forma:
super(argumentos);
Esta instrucción tiene que ser la primera sentencia dentro del constructor de la clase Hijo.
Ejercicio 34: Cree la clase Persona en el package padre con los atributos protegidos: nombre
(cadena), apellido (cadena) y edad (entero). A través de un constructor inicialice sus atributos.
Implemente un método que autogenere un correo electrónico y un método que retorne en una
cadena los atributos protegidos.
package padre;
// Atributos protegidos
protected String nombre, apellido;
protected int edad;
// Constructor
public Persona(String nombre, String apellido, int edad) {
this.nombre = nombre;
this.apellido = apellido;
this.edad = edad;
}
// Operaciones
public String generarCorreo() {
return nombre + "." + apellido + "@cibertec.edu.pe";
}
Ejercicio 35: Cree la clase Alumno en el package hijo que herede de la clase Persona. Considere
como atributos privados tres notas enteras. A través de su constructor reciba la data del alumno
y derive a la clase Persona la información que corresponda. Implemente un método que retorne
el promedio del alumno y un método que retorne los datos completos del alumno (heredando
los datos de la clase Persona).
package hijo;
import padre.Persona;
// Constructor
public Alumno(String nombre, String apellido, int edad,
int nota1, int nota2, int nota3) {
super(nombre,apellido,edad);
this.nota1 = nota1;
this.nota2 = nota2;
this.nota3 = nota3;
}
// Operaciones
public double calcularPromedio() {
return (nota1 + nota2 + nota3) / 3.0;
}
Ejercicio 36: Cree la clase Docente en el package hijo que herede de la clase Persona. Considere
como atributos privados horas trabajadas (entero) y tarifa por hora (real). A través de su
constructor reciba la data del docente y derive a la clase Persona la información respectiva.
Implemente un método que retorne el sueldo del docente y un método que retorne los datos
completos del docente (heredando los datos de la clase Persona).
package hijo;
import padre.Persona;
// Constructor
public Docente(String nombre, String apellido, int edad,
int horas, double tarifa) {
super(nombre,apellido,edad);
this.horas = horas;
this.tarifa = tarifa;
}
// Operaciones
public double calcularSueldo() {
return horas*tarifa;
}
Ejercicio 37: En el programa principal declare y cree un objeto de cada clase con datos fijos y
aplicando sobrecarga de métodos, implemente tres métodos listado, uno para cada tipo de
objeto.
package cibertec;
import padre.Persona;
import hijo.*;
…
public class Programa extends JFrame implements ActionListener {
…
protected void actionPerformedBtnProcesar(ActionEvent arg0) {
Persona p = new Persona("Juan","Matos",18);
listado(p);
void listado(Alumno x) {
imprimir(">>> A L U M N O");
imprimir(x.datosCompletos());
imprimir("Correo : " + x.generarCorreo());
imprimir("Promedio : " + x.calcularPromedio());
imprimir("");
}
void listado(Docente x) {
imprimir(">>> D O C E N T E");
imprimir(x.datosCompletos());
imprimir("Correo : " + x.generarCorreo());
imprimir("Sueldo : " + x.calcularSueldo());
}
…
}
Una clase Hijo puede añadir nuevos miembros e incluso puede redefinir miembros de la clase
Padre. Redefinir un miembro de la superclase implica definir en la subclase un miembro con el
mismo nombre que el de la superclase. Esto hace que el miembro de la superclase quede oculto
en la subclase. A la redefinición de métodos se denomina también sobrescritura de métodos.
Se utiliza super también para acceder desde la Clase Hijo a un método de la Clase Padre, en caso
que la Clase Hijo cuente con un método igual en sintaxis.
package padre;
Ejercicio 39: Utilice super en la clase Alumno para hacer que el método dadosCompletos de
dicha clase ejecute el método datosCompletos de la clase Persona.
package hijo;
import padre.Persona;
Ejercicio 40: Utilice super en la clase Docente para hacer que el método datosCompletos de
dicha clase ejecute el método datosCompletos de la clase Persona.
package hijo;
import padre.Persona;
Ejercicio 41: En el programa principal ajuste el método listado que recibe un objeto de tipo
Persona dado el cambio de nombre del método datosDeLaPersona por el de datosCompletos.
package cibertec;
import padre.Persona;
import hijo.*;
…
public class Programa extends JFrame implements ActionListener {
…
protected void actionPerformedBtnProcesar(ActionEvent arg0) {
Persona p = new Persona("Juan","Matos",18);
listado(p);
void listado(Alumno x) {
imprimir(">>> A L U M N O");
imprimir(x.datosCompletos());
imprimir("Correo : " + x.generarCorreo());
imprimir("Promedio : " + x.calcularPromedio());
imprimir("");
}
void listado(Docente x) {
imprimir(">>> D O C E N T E");
imprimir(x.datosCompletos());
imprimir("Correo : " + x.generarCorreo());
imprimir("Sueldo : " + x.calcularSueldo());
}
…
}
Una Clase abstracta es aquella que no permite crear objetos de manera directa. Se usa
únicamente para crear subClases. Una clase abstracta se etiqueta con la palabra reservada
abstract.
package padre;
SI una Clase tiene por lo menos un método abstracto, entonces la clase tiene que ser abstracta,
de lo contrario el compilador mostrará un mensaje de error.
package padre;
Ejercicio 44: En la clase Alumno implemente por obligación el método público identificacion.
package hijo;
import padre.Persona;
Ejercicio 45: En la clase Docente implemente por obligación el método público identificacion.
package hijo;
import padre.Persona;
Ejercicio 46: En los métodos listado del programa principal muestre la identificación del objeto
recibido respectivamente.
package cibertec;
import padre.Persona;
import hijo.*;
…
public class Programa extends JFrame implements ActionListener {
…
protected void actionPerformedBtnProcesar(ActionEvent arg0) {
Alumno a = new Alumno("Marco","Salazar",23,14,16,15);
listado(a);
void listado(Docente x) {
imprimir(x.identificacion());
imprimir(x.datosCompletos());
imprimir("Correo : " + x.generarCorreo());
imprimir("Sueldo : " + x.calcularSueldo());
}
}
El casting consiste en realizar conversiones de tipo. El casting no modifica al objeto sólo su tipo.
Tiene sentido únicamente por la existencia de la herencia.
4.1.7.1. Upcasting
Permite interpretar un objeto de una Clase derivada como del mismo tipo que la Clase base.
También se puede ver como la conversión de un tipo en otro superior en la jerarquía de clases.
No hace falta especificarlo. Ejemplo:
oa, om, op de tipo Object no reconocen los métodos mensaje() ni hacerRuido() porque no
aparecen en la Clase Object.
// Upcasting
Object oa = new Animal();
Object om = new Mamifero();
Object op = new Perro();
Animal am = new Mamifero();
Animal ap = new Perro();
Mamifero mp = new Perro();
imprimir("U P C A S T I N G");
imprimir(">>> Objeto am");
imprimir("hacer ruido : " + am.hacerRuido());
imprimir("");
imprimir(">>> Objeto ap");
imprimir("hacer ruido : " + ap.hacerRuido());
imprimir("");
imprimir(">>> Objeto mp");
imprimir("mensaje : " + mp.mensaje());
imprimir("hacer ruido : " + mp.hacerRuido());
}
4.1.7.2. Downcasting
Permite interpretar un objeto de una Clase base como del mismo tipo que su Clase derivada.
También se puede ver como la conversión de un tipo en otro inferior en la jerarquía de clases.
Se especifica precediendo al objeto a convertir con el nuevo tipo entre paréntesis. Ejemplo:
mo, ma de tipo Mamifero reconocen los métodos mensaje() y hacerRuido(), el primero lo ejecuta
en la Clase Mamífero y el segundo en la Clase Animal.
po, pa, pm de tipo Perro reconocen los métodos mensaje() y hacerRuido(), ambos se ejecutan
en la Clase Perro.
imprimir("D O W N C A S T I N G");
imprimir(">>> Objeto ao");
imprimir("hacer ruido : " + ao.hacerRuido());
imprimir("");
imprimir(">>> Objeto mo");
imprimir("mensaje : " + mo.mensaje());
imprimir("hacer ruido : " + mo.hacerRuido());
imprimir("");
imprimir(">>> Objeto ma");
imprimir("mensaje : " + ma.mensaje());
imprimir("hacer ruido : " + ma.hacerRuido());
imprimir("");
imprimir(">>> Objeto po");
imprimir("mensaje : " + po.mensaje());
imprimir("hacer ruido : " + po.hacerRuido());
imprimir("");
imprimir(">>> Objeto pa");
imprimir("mensaje : " + pa.mensaje());
imprimir("hacer ruido : " + pa.hacerRuido());
imprimir("");
imprimir(">>> Objeto pm");
imprimir("mensaje : " + pm.mensaje());
imprimir("hacer ruido : " + pm.hacerRuido());
}
4.1.8.1. Polimorfismo
El polimorfismo está presente cuando se realiza la llamada a un método de un objeto del que
no se sabe su tipo hasta que el programa esté en ejecución. Al tener métodos sobrescritos,
objetos de diferentes tipos pueden responder de forma diferente a la misma llamada, de tal
forma que podemos escribir código de forma general sin preocuparnos del método concreto
que se ejecutará en cada momento.
void listado(Mamifero x) {
imprimir("mensaje : " + x.mensaje());
imprimir("hacer ruido : " + x.hacerRuido());
}
void listado(Mamifero x) {
if (x instanceof Gato)
imprimir(">>> objeto GATO");
else
imprimir(">>> objeto PERRO");
Ejercicios
Ejercicio Propuesto 1
Diseñe la clase Figura en el paquete padre que contenga:
- Atributos privados: x, y que representa la ubicación de la figura geométrica.
- Constructor que inicializa los atributos de la clase.
- Un método ubicacion() que retorna la ubicación de la figura geométrica según sus posiciones
x e y.
Luego, implemente dos subclases de Figura: Cuadrado y Circulo en el paquete hijo.
Cuadrado presenta los siguientes miembros:
- Atributo privado: lado
- Constructor con parámetros para inicializar los atributos: x, y, lado.
- Método area() que retorna el area del cuadrado (lado*lado)
Circulo presenta los siguientes miembros:
- Atributo privado: radio
- Constructor con parámetros para inicializar los atributos: x, y, radio.
- Método area() que retorna el área del círculo (pi*radio*radio)
Por último, implemente el método Procesar en el programa principal que contiene y cree 2
objetos: uno de tipo Cuadrado y el otro de tipo Circulo e imprima su ubicación y área de cada
objeto.
Ejercicio Propuesto 2
Diseñe la clase Trabajador en el paquete padre con los siguientes elementos:
- Atributos protegidos: nombre, apellido y telefono de tipo String
- Constructor que inicializa los atributos de la clase.
- Un método codigoGenerado() que retorna el código formado por el primer carácter del
nombre, el último carácter del apellido y el teléfono del trabajador.
- Un método datosDelTrabajador() que retorne en una cadena los datos completos del
trabajador.
Luego, implemente dos subclases de Trabajador: Empleado y Consultor en el paquete hijo.
Empleado presenta los siguientes miembros:
- Atributos privados: sueldo básico y porcentaje de bonificación
- Constructor con parámetros para inicializar los atributos: nombre, apellido, teléfono, sueldo
básico y porcentaje de bonificación.
- Un método boniSoles() que retorna la bonificación en soles (sbas*porcentajeBonificacion /
100)
- Un método sbruto() que retorna el sueldo bruto del empleado (sbas+bonificación en soles)
- Un método datosCompletos() que retorne una cadena conteniendo: nombre, apellido,
telefono, bonificación en soles y el sueldo bruto.
Consultor presenta los siguientes miembros:
- Atributos privados: horas trabajadas y tarifa horaria.
- Constructor con parámetros para inicializar los atributos: nombre, apellido, teléfono, horas
y tarifa
- Un método sbruto() que retorna el sueldo bruto del consultor (horas*tarifa)
- Un método datosCompletos() que retorne una cadena conteniendo: nombre, apellido,
telefono y el sueldo bruto.
Por último, a la pulsación del botón Procesar de la clase Principal (donde está laGUI), cree 2
objetos con datos fijos: uno de tipo Empleado y el otro de tipo Consultor e imprima sus datos
invocando al método mostrarDatos() y su código generado.
4.2. Interfaces
4.2.1. Definición
Una interfaz es una Clase completamente abstracta, es decir no tiene implementación. Lo único
que puede tener son declaraciones de métodos y definiciones de constantes simbólicas. En Java,
las interfaces se declaran con la palabra reservada interface. La clase que implementa una o más
interfaces utiliza la palabra reservada implements. Para ello, es necesario que la clase
implemente todos los métodos definidos por la interfaz. Ejemplo:
package cibertec;
…
public class Programa extends JFrame implements ActionListener, ItemListener{
…
public void actionPerformed(ActionEvent arg0) {
…
}
Una interfaz podrá verse simplemente como una forma, es como un molde; solamente permite
declarar nombres de métodos. En este caso, no es necesario definirlos como abstractos, puesto
que lo son implícitamente; y si adicionalmente tiene miembros datos, éstos serán constantes,
es decir, static y final. Al utilizar implements para el interfaz es como si se hiciese una acción de
copiar y pegar el código de la interfaz, con lo cual no se hereda nada, solamente se pueden usar
los métodos.
La ventaja principal del uso de interfaces es que puede ser implementada por cualquier número
de clases, permitiendo a cada clase compartir el interfaz de programación sin tener que ser
consciente de la implementación que hagan las otras clases que implementen el interfaz. La
principal diferencia entre interfaz y clase abstracta es que la interfaz posee un mecanismo de
encapsulamiento sin forzar al usuario a utilizar la herencia.
En Java realmente no existe la herencia múltiple, lo que se puede hacer es crear una clase que
implemente (implements) más de un interfaz, pero sólo puede extender a una clase (extends).
Ejemplo
package interfaz;
package interfaz;
package padre;
package hijo;
import padre.Mamifero;
import interfaz.InterfazA;
package hijo;
import padre.Mamifero;
import interfaz.*;
package cibertec;
import padre.Mamifero;
import hijo.*;
…
public class Programa extends JFrame implements ActionListener {
…
protected void actionPerformedBtnProcesar(ActionEvent arg0) {
Gato g = new Gato();
listado(g);
if (x instanceof Gato) {
imprimir("vacuna A : " + ((Gato)x).vacunaA);
imprimir("cuidado : " + ((Gato)x).cuidado());
} else {
imprimir("vacuna A : " + ((Perro)x).vacunaA);
imprimir("vacuna B : " + ((Perro)x).vacunaB);
imprimir("cuidado : " + ((Perro)x).cuidado());
imprimir("peligro : " + ((Perro)x).peligro());
}
}
…
}
Ejemplo
Diseño de una aplicación que muestra las operaciones avanzar, detener, retroceder, subir y
bajar que pueden hacer los medios de transporte auto, bicicleta, moto, avión y helicóptero.
Consideramos que algunos son terrestres y otros son aereos. Por lo tanto, hay operaciones que
por ejemplo un avión puede hacer pero no un auto. En la solución empleamos interfaces, clases
abstractas y subclases.
package interfaz;
package interfaz;
package padre;
import interfaz.Movimiento;
package hijo;
import padre.Transporte;
package hijo;
import padre.Transporte;
package hijo;
import padre.Transporte;
package hijo;
import padre.Transporte;
import interfaz.Vuelo;
package hijo;
import padre.Transporte;
import interfaz.Vuelo;
package cibertec;
import padre.Transporte;
import hijo.*;
…
public class Programa extends JFrame implements ActionListener {
protected void actionPerformedBtnProcesar(ActionEvent arg0) {
Auto aut = new Auto(5);
listado(aut);
imprimir("");
UNIDAD
5
ARCHIVOS
LOGRO DE LA UNIDAD DE APRENDIZAJE
Al término de la unidad, los alumnos utilizan los métodos de la clase ArrayList para efectuar
operaciones con objetos (ingresar, consultar, eliminar, modificar, listar entre otras). Utilizan las
clases PrintWriter, FileWriter, BufferedReader y FileReader para almacenar la data en archivos
de texto.
TEMARIO
5.1. Tema 14 : Manejo de archivos de texto
5.1.1 : Descripción
5.1.2 : Clases PrintWriter y FileWriter
5.1.3 : Escritura en un archivo de texto
5.1.4 : Clases BufferedReader y FileReader
5.1.5 : Método split de la clase String
5.1.6 : Lectura de un archivo de texto
ACTIVIDADES PROPUESTAS
• Emplear los métodos de la clase ArrayList para manipular un arreglo de objetos.
• Crear un mantenimiento.
• Emplear las clases PrintWriter, FileWriter, BufferedReader, FileReader y File
para almacenar un arreglo de objetos en archivos de texto.
• Manipular arreglo de objetos utilizando los métodos de la clase ArrayList.
5.1.1. Descripcion
Para tener acceso a las clases que permiten manejar archivos de texto es necesario colocar:
import java.io.*;
Todo código que involucre manejo de archivos debe estar en una estructura try catch, ya que
podría producirse algún error. Por ejemplo, si no existe el archivo.
try {
…
} catch(Exception e) {
…
}
A través de su constructor debemos enviar un objeto creado del tipo FileWriter con el nombre
del archivo a crear. Ejemplo:
pw.close();
Asumiendo el coleccionista ArrayList de tipo Docente representado por doc luego de cuatro
ingresos.
Ejercicio 47: Añada un método público a la clase ArregloDocentes que grabe el ArrayList de
docentes en el archivo de texto Docentes.txt.
pw.println(linea);
}
pw.close();
} catch(Exception e) {
}
}
A través de su constructor debemos enviar un objeto creado del tipo FileReader con el nombre
del archivo a leer. Ejemplo:
El método readLine() asociado a br retorna una cadena y genera un salto de línea. Ejemplo:
br.close();
Busca un tope en una cadena y distribuye una copia de las subcadenas en un arreglo lineal de
cadenas. Ejemplo:
El resultado será:
s[0] "123"
s[1] "Ana"
s[2] "20"
s[3] "55.0"
Ejercicio 48: Añada un método público a la clase ArregloDocentes que cargue el archivo de
texto Docentes.txt en el ArrayList de docentes.
doc.add(new Docente(codigo,nombre,horas,tarifa));
}
br.close();
}catch(Exception e) {
}
}
Permite averiguar acerca de un archivo antes de realizar alguna actividad sobre él. El método
exists() devuelve true o false en caso exista o no exista el archivo. Ejemplo:
File f;
f = new File("Docentes.txt");
if (f.exists()) {
…
} else {
…
}
Ejercicio 49: Añada un atributo privado de tipo cadena en ArregloDocentes que guarde el
nombre del archivo. Dicho atributo se inicializará a través del constructor. Asimismo dentro del
constructor invoque al método cargarDocentes. Implemente los métodos de acceso público
set/get respectivos.
package semana_11;
import java.util.ArrayList;
// Constructor
public ArregloDocentes(String archivo) {
doc = new ArrayList <Docente> ();
this.archivo = archivo;
cargarDocentes();
}
Ejercicio 50: En el programa principal envíe el nombre del archivo de texto al momento de
crear el objeto ad.
package cibertec;
import semana_11.*;
5.2. Mantenimiento
Ejercicio 51: Diseñe la clase Persona en el paquete clases con los atributos privados: codigo
(int), nombre (String), dni (String), peso (double), estatura (double) y estado (int).
Implemente además
- Un constructor que inicialice a todos los atributos.
- Métodos de acceso público set para todos los atributos privados. Use la referencia this.
- Métodos de acceso público get para todos los atributos privados.
- Método público que retorne el índice de masa corporal:
imc = peso / (estatura * estatura)
package clases;
// Constructor
public Persona(int codigo, String nombre, String dni,
double peso, double estatura, int estado) {
this.codigo = codigo;
this.nombre = nombre;
this.dni = dni;
this.peso = peso;
this.estatura = estatura;
this.estado = estado;
}
- Un método eliminar que reciba la dirección de memoria de un objeto Persona y lo retire del
ArrayList.
- Un método buscar que busque un código y retorne la dirección de memoria del objeto que
lo contiene. En caso no exista retorne null.
- Un método buscar que busque un dni y retorne la dirección de memoria del objeto que lo
contiene. En caso no exista retorne null.
- Un método codigoCorrelativo que retorne un número entero autogenerado y correlativo
empezando a partir de 10001.
- Un método grabarPersonas que guarde los datos de las Personas en un archivo de texto.
- Un método cargarPersonas que lea los datos de las Personas de un archivo de texto.
package arreglos;
import clases.Persona;
import java.util.ArrayList;
// Constructor
public ArregloPersonas () {
per = new ArrayList <Persona> ();
adicionar(new Persona(1001, "Juan Prado Salazar", "07557853", 82.3, 1.75, 3));
adicionar(new Persona(1002, "Pedro Romero Soto", "11002348", 79.5, 1.58, 1));
adicionar(new Persona(1003, "Luis Pinto Garza", "62279345", 82.7, 1.83, 0));
adicionar(new Persona(1004, "Daniel Rojas Saenz", "20977241", 80.2, 1.72, 2));
adicionar(new Persona(1005, "Jorge Espinal Vega", "06377845", 75.9, 1.88, 1));
}
return null;
}
}
}
public void cargarPersonas() {
try {
BufferedReader br;
String linea, nombre;
String s[];
int codigo;
double peso, estatura;
br = new BufferedReader(new FileReader(archivo));
while ((linea = br.readLine()) != null) {
s = linea.split(";");
codigo = Integer.parseInt(s[0].trim());
nombre = s[1].trim();
peso = Double.parseDouble(s[2].trim());
estatura = Double.parseDouble(s[3].trim());
adicionar(new Persona(codigo, nombre, peso, estatura));
}
br.close();
} catch (Exception e) {
}
}
}
Ejercicio 53: Diseñe en la clase principal DlgPersona una GUI adecuada para realizar las
operaciones básicas de todo proyecto: adicionar, consultar, modificar y eliminar. Realice las
package guis_1;
import clases.Persona;
import arreglos.ArregloPersonas;
import java.awt.EventQueue;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
ajustarAnchoColumnas();
listar();
}
// Declaración global
ArregloPersonas ap = new ArregloPersonas();
if (arg0.getSource() == btnVolver) {
actionPerformedBtnVolver(arg0);
}
if (arg0.getSource() == btnAceptar) {
actionPerformedBtnAceptar(arg0);
}
if (arg0.getSource() == btnEliminar) {
actionPerformedBtnEliminar(arg0);
}
if (arg0.getSource() == btnModificar) {
actionPerformedBtnModificar(arg0);
}
if (arg0.getSource() == btnConsultar) {
actionPerformedBtnConsultar(arg0);
}
if (arg0.getSource() == btnAdicionar) {
actionPerformedBtnAdicionar(arg0);
}
}
txtCodigo.setText("" + ap.codigoCorrelativo());
txtNombre.setText("");
txtDni.setText("");
txtPeso.setText("");
txtEstatura.setText("");
habilitarEntradas(true);
habilitarBotones(false);
txtNombre.requestFocus();
}
txtCodigo.setEditable(true);
habilitarBotones(false);
txtCodigo.requestFocus();
}
txtCodigo.setEditable(true);
habilitarEntradas(true);
habilitarBotones(false);
txtCodigo.requestFocus();
}
txtCodigo.setEditable(true);
habilitarBotones(false);
}
void listar() {
Persona x;
modelo.setRowCount(0);
for (int i=0; i<ap.tamaño(); i++) {
x = ap.obtener(i);
modelo.addRow(fila);
}
}
void consultarPersona() {
try {
Persona x = ap.buscar(leerCodigo());
if (x != null) {
txtNombre.setText(x.getNombre());
txtDni.setText(x.getDni());
txtPeso.setText("" + x.getPeso());
txtEstatura.setText("" + x.getEstatura());
cboEstadoCivil.setSelectedIndex(x.getEstado());
txtCodigo.requestFocus();
} else
error("El código " + leerCodigo() + " no existe", txtCodigo);
} catch (Exception e) {
error("Ingrese CÓDIGO correcto", txtCodigo);
}
}
void adicionarPersona() {
int codigo = leerCodigo();
String nombre = leerNombre();
if (nombre.length() > 0) {
String dni = leerDni();
if (ap.buscar(dni) == null)
try {
double peso = leerPeso();
try {
double estatura = leerEstatura();
int estado = leerPosEstado();
Persona nueva = new Persona(codigo, nombre,
dni, peso,
estatura, estado);
ap.adicionar(nueva);
listar();
txtCodigo.setText("" + ap.codigoCorrelativo());
txtNombre.setText("");
txtDni.setText("");
txtPeso.setText("");
txtEstatura.setText("");
txtNombre.requestFocus();
} catch (Exception e) {
error("Ingrese ESTATURA correcta", txtEstatura);
}
} catch (Exception e) {
error("Ingrese PESO correcto", txtPeso);
}
else
error("Ingrese DNI correcto", txtDni);
} else
error("Ingrese NOMBRE correcto", txtNombre);
}
void eliminarPersona() {
try {
int codigo = leerCodigo();
Persona x = ap.buscar(codigo);
if (x != null) {
ap.eliminar(x);
listar();
txtCodigo.setText("");
txtNombre.setText("");
txtDni.setText("");
txtPeso.setText("");
txtEstatura.setText("");
txtCodigo.requestFocus();
} else
error("El código " + codigo + " no existe", txtCodigo);
} catch (Exception e) {
error("Ingrese CÓDIGO correcto", txtCodigo);
}
}
void modificarPersona() {
try {
Persona x = ap.buscar(leerCodigo());
String nombre = leerNombre();
if (nombre.length() > 0) {
String dni = leerDni();
Persona y = ap.buscar(dni);
if (y == null || x.equals(y))
try {
double peso = leerPeso();
try {
double estatura = leerEstatura();
int estado = leerPosEstado();
x.setNombre(nombre);
x.setDni(dni);
x.setPeso(peso);
x.setEstatura(estatura);
x.setEstado(estado);
listar();
txtCodigo.requestFocus();
} catch (Exception e) {
error("Ingrese ESTATURA correcta",
txtEstatura);
}
} catch (Exception e) {
error("Ingrese PESO correcto", txtPeso);
}
else
error("Ingrese DNI correcto", txtDni);
} else
error("Ingrese NOMBRE correcto", txtNombre);
} catch (Exception e) {
error("Ingrese CÓDIGO correcto", txtCodigo);
}
}
if (tipoOperacion == CONSULTAR)
btnAceptar.setEnabled(false);
else
btnAceptar.setEnabled(!sino);
btnVolver.setEnabled(!sino);
}
void mensaje(String s) {
JOptionPane.showMessageDialog(this, s);
}
String leerNombre() {
return txtNombre.getText().trim();
}
String leerDni() {
return txtDni.getText().trim();
}
double leerPeso() {
return Double.parseDouble(txtPeso.getText().trim());
}
double leerEstatura() {
return Double.parseDouble(txtEstatura.getText().trim());
}
int leerPosEstado() {
return cboEstadoCivil.getSelectedIndex();
}
// Métodos que retornan valor (con parámetros)
int anchoColumna(int porcentaje) {
return porcentaje * scrollPane.getWidth() / 100;
}
String enTextoEstadoCivil(int i) {
return cboEstadoCivil.getItemAt(i);
}
}
Ejercicios
Ejercicio Propuesto 1
Asuma la existencia de la clase Celular que cuenta con los siguientes atributos privados: codigo
(entero), marca (cadena), modelo (cadena) y precio unitario (real). Considere que la clase cuenta
con un constructor que inicializa los atributos y los métodos de acceso set y get para cada
atributo. Diseñe las opciones de ingresar, modificar y listar del mantenimiento de celulares. Para
ello implemente las clases ArregloCelulares (clase que maneja un objeto privado de tipo
ArrayList) y la clase Principal (clase que controla la GUI).
1) Diseñe un método que aumente en 8% el precio unitario de los celulares cuya marca termine
con la letra ‘a’
2) Diseñe un método que retorne la cantidad de celulares de la marca enviada como parámetro.
Ejercicio Propuesto 2
Asuma la existencia de la clase Video que cuenta con los siguientes atributos privados: codVideo
(entero), nombre de película (cadena), codGenero (0=comedia, 1=suspenso, 2=terror) y precio
unitario (real). Considere que la clase cuenta con un constructor que inicializa los atributos y los
métodos de acceso set y get para cada atributo. Diseñe las opciones de ingresar, consultar y
eliminar del mantenimiento de videos. Para ello implemente las clases ArregloVideos (clase que
maneja un objeto privado de tipo ArrayList) y la clase Principal (clase que controla la GUI).
1) Diseñe un método que imprima el precio unitario promedio de aquellos videos del género
suspenso.
2) Diseñe un método que elimine los videos del género ingresado desde la GUI.
Ejercicio Propuesto 3
Asuma la existencia de la clase Vendedor que cuenta con los siguientes atributos privados:
codigo (entero), nombre (cadena), y monto vendido (real). Considere que la clase cuenta con un
constructor que inicializa los atributos y los métodos de acceso set y get para cada atributo.
Diseñe las opciones de ingresar, consultar, modificar, eliminar y listar del mantenimiento de
vendedores. Para ello implemente las clases ArregloVendedores (clase que maneja un objeto
privado de tipo ArrayList) y la clase Principal (clase que controla la GUI).
1) Diseñe un método que imprima el monto promedio de aquellos vendedores cuyo nombre
empiece con ‘J’
2) Diseñe un método que imprima el nombre del vendedor que vendió que generó más
ingresos.
Ejercicio Propuesto 4
Asuma la existencia de la clase Celular que cuenta con los siguientes atributos privados: codigo
(entero), marca (cadena), modelo (cadena) y precio unitario (real). Considere que la clase cuenta
con un constructor que inicializa los atributos y los métodos de acceso set y get para cada
atributo.
Ejercicio Propuesto 5
Diseñe un mantenimiento de videos que permita ingresar, consultar, modificar, eliminar y listar
videos. Para ello, cree las clases Video, ArregloVideos y Principal. Cree los métodos cargar y
grabar en la clase ArregloVideos. Al cargar el JApplet se deberán leer los datos del archivo
videos.txt, si el archivo no existe deberá aparecer un mensaje de error.
Asuma la existencia de la clase Video que cuenta con los siguientes atributos privados: codVideo
(entero), nombre de película (cadena), codGenero (0=comedia, 1=suspenso, 2=terror) y precio
unitario (real). Considere que la clase cuenta con un constructor que inicializa los atributos y los
métodos de acceso set y get para cada atributo.
---
ANEXO
ANEXO
OBJETIVO ESPECIFICO
ACTIVIDADES CONSIDERADAS
En la opción de búsqueda puede realizar consultas de qué casas y/o departamentos están
disponibles según los criterios seleccionados: área, precio, más barato y más caro.
En el caso de las casas que tengan jardin debe darle clic a la casilla de verificación Jardin. Sólo
cuando una casa no este disponible porque por ejemplo ya se rentó debe desmarcar la casilla
de verificación Disponibilidad.
El JTextField de piso se refiere a la ubicación del departamento dentro del edificio o condominio.
Ingrese los rangos de área y precio según sea el caso y pulse clic al botón Procesar para ejecutar
la búsqueda.
Clase Propiedad
package renta;
Clase Casa
package renta;
Clase Departamento
package renta;
Clase ArregloCasas
package arreglos;
import java.util.ArrayList;
import java.io.*;
import renta.Casa;
public ArregloCasas() {
aCasas = new ArrayList <Casa> ();
}
return menor;
}
return mayor;
}
BufferedReader br;
br = new BufferedReader(new FileReader("Casas.txt"));
codigo = Integer.parseInt(s[0].trim());
hab = Integer.parseInt(s[1]trim());
ancho = Double.parseDouble(s[2].trim());
largo = Double.parseDouble(s[3].trim());
precio = Double.parseDouble(s[4].trim());
disp = Boolean.parseBoolean(s[5].trim());
jardin = Boolean.parseBoolean(s[6].trim());
aCasas.add(new Casa(codigo,
hab,
ancho,
largo,
precio,
disp,
jardin));
}
br.close();
} catch(Exception e) {
}
}
pw.close();
} catch(Exception e) {
}
}
}
Clase ArregloDepartamentos
package arreglos;
import java.util.ArrayList;
import java.io.*;
import renta.Departamento;
public ArregloDepartamentos() {
aDptos = new ArrayList <Departamento> ();
}
return menor;
}
return mayor;
}
BufferedReader br;
br = new BufferedReader(new FileReader("Departamentos.txt"));
aDptos.add(new Departamento(codigo,
hab,
ancho,
largo,
precio,
disp,
piso));
}
br.close();
}
catch(Exception e) {
}
}
import javax.swing.*;
import arreglos.*;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Font;
Clase PPrincipal
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
setLayout(null);
setBackground(Color.lightGray);
if (arg0.getSource() == btnMtoDptos) {
actionPerformedBtnMtoDptos(arg0);
}
if (arg0.getSource() == btnBusquedas) {
actionPerformedBtnBusquedas(arg0);
}
}
Clase PFormulario
import javax.swing.*;
import java.awt.*;
public PFormulario() {
setLayout(null);
setBackground(Color.lightGray);
lblHab=new JLabel("Habitaciones:");
lblHab.setBounds(10,172,150,20);
add(lblHab);
txtPrecio=new JTextField();
txtPrecio.setBounds(150,152,150,20);
add(txtPrecio);
Clase PCasa
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import compartido.LibGUI;
import renta.Casa;
lblTitulo.setText("Mantenimiento de Casas");
btnAceptar.addActionListener(this);
btnCancelar.addActionListener(this);
cboOpcion.addItemListener(this);
chkDispo.addItemListener(this);
btnModificar.addActionListener(this);
btnEliminar.addActionListener(this);
chkJardin=new JCheckBox("Jardin");
chkJardin.setBounds(400,172,150,20);
chkJardin.setBackground(Color.lightGray);
chkJardin.addItemListener(this);
add(chkJardin);
pro.aCas.cargarCasas();
if(e.getSource()==btnCancelar) {
cancelar();
}
if(e.getSource()==btnModificar) {
modificarCasa();
}
if(e.getSource()==btnEliminar) {
eliminarCasa();
}
}
if(e.getItemSelectable()==chkJardin){
flagJardin=!flagJardin;
}
if(e.getSource()==cboOpcion){
int indice=cboOpcion.getSelectedIndex();
if(indice==1 || indice==3)
desabilitarControles();
else
habilitarControles();
}
}
switch(indice){
case 0: ingresar(); break;
case 1: consultar(); break;
case 2: modificar(); break;
default: eliminar();
}
}
habilitarControles();
limpiarControles();
existe=false;
cambio();
}
else
JOptionPane.showMessageDialog(this,"Código ya existe ");
limpiarControles();
}
boolean flag1=Ocasa.getDisp();
if(flag1)
chkDispo.setSelected(true);
else
chkDispo.setSelected(false);
boolean flag2=Ocasa.getJardin();
if(flag2)
chkJardin.setSelected(true);
else
chkJardin.setSelected(false);
existe=true;
} else {
JOptionPane.showMessageDialog(this,"Código no existe.");
limpiarControles();
existe=false;
}
}
Clase PDepartamento
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import compartido.LibGUI;
import renta.Departamento;
public PDepartamento(Principal x) {
pro = x;
lblTitulo.setText("Mantenimiento de Departamentos");
txtPiso=new JTextField();
txtPiso.setBounds(150,192,150,20);
add(txtPiso);
btnAceptar.addActionListener(this);
btnCancelar.addActionListener(this);
cboOpcion.addItemListener(this);
chkDispo.addItemListener(this);
btnModificar.addActionListener(this);
btnEliminar.addActionListener(this);
pro.aDpt.cargarDepartamentos();
}
if(e.getSource()==btnCancelar) {
cancelar();
}
if(e.getSource()==btnModificar) {
modificarDpto();
}
if(e.getSource()==btnEliminar) {
eliminarDpto();
}
}
if(e.getSource()==cboOpcion){
int indice=cboOpcion.getSelectedIndex();
if(indice==1 || indice==3)
desabilitarControles();
else
habilitarControles();
}
}
switch(indice){
case 0: ingresar(); break;
case 1: consultar(); break;
case 2: modificar(); break;
default: eliminar();
}
}
limpiarControles();
}
Clase PBusqueda
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import compartido.LibGUI;
import renta.Propiedad;
import arreglos.*;
public PBusqueda(Principal x) {
pri=x;
setLayout(null);
setBackground(Color.lightGray);
lblTitulo=new JLabel("Busquedas",JLabel.CENTER);
lblTitulo.setFont(new Font("Arial",Font.BOLD,20));
lblTitulo.setBounds(0,20,600,20);
add(lblTitulo);
cboTipo=new JComboBox();
cboTipo.setBounds(90,60,120,20);
cboTipo.addItem("Casa");
cboTipo.addItem("Departamento");
add(cboTipo);
scpScroll=new JScrollPane(txtS);
scpScroll.setBounds(10, 150, 580, 300);
add(scpScroll);
deshabilita_area();
deshabilita_precio();
}
imprimir();
if(indice==0){
imprimir("Código\tAncho\tLargo\tPrecio\tArea\tJardin");
imprimir();
if(indice==0){
imprimir("Código\tAncho\tLargo\tPrecio\tArea\tJardin");
for( int i = 0; i < pri.aCas.tamaño(); i++ ){
Propiedad prop=pri.aCas.obtener(i);
if(prop.getDisp() &&
prop.getPrecio() >= preciomin &&
prop.getPrecio() <= preciomax){
imprimir(prop.comoCadena());
conta++;
}
}
imprimir(conta + " casa(s) encontrada(s)");
} else {
imprimir("Código\tAncho\tLargo\tPrecio\tArea\tPiso");
for( int i = 0; i < pri.aDpt.tamaño(); i++ ){
Propiedad prop=pri.aDpt.obtener(i);
if(prop.getDisp() &&
prop.getPrecio() >= preciomin &&
prop.getPrecio() <= preciomax){
imprimir(prop.comoCadena());
conta++;
}
}
imprimir(conta + " departamento(s) encontrado (s)");
}
}
imprimir();
if (indice == 0) {
imprimir("Código\tAncho\tLargo\tPrecio\tArea\tJardin");
for (int i=0; i<pro.aCas.tamaño(); i++) {
Propiedad prop = pro.aCas.obtener(i);
if (prop.getDisp() &&
prop.area() >= areamin &&
prop.area() <= areamax &&
prop.getPrecio() >= preciomin &&
prop.getPrecio() <= preciomax) {
imprimir(prop.comoCadena());
conta++;
}
}
imprimir(conta + " casa(s) encontrada(s)");
} else {
imprimir("Código\tAncho\tLargo\tPrecio\tArea\tPiso");
for (int i=0; i<pro.aDpt.tamaño(); i++ ) {
Propiedad prop = pro.aDpt.obtener(i);
if (prop.getDisp() && prop.area() >= areamin &&
prop.area() <= areamax &&
prop.getPrecio() >= preciomin &&
prop.getPrecio() <= preciomax) {
imprimir(prop.comoCadena());
conta++;
}
}
imprimir(conta + " departamento(s) encontrado(s)");
}
}
prop.getPrecio() == pro.aDpt.precioMayor()) {
imprimir(prop.comoCadena());
conta++;
}
}
imprimir(conta + " departamento(s) encontrado(s)");
}
}
6.2. Miscelanea
Clase ArrayList
Dada la Clase Impresora:
public class Impresora {
// Atributos privados
private int codProducto, codBarras;
private String marca;
private double precio;
// Constructor
public Impresora(int codProducto, int codBarras,
String marca, double precio) {
this.codProducto = codProducto;
this.codBarras = codBarras;
this.marca = marca;
this.precio = precio;
}
Diseñe la Clase ArregloImpresoras que tenga como atributo privado un objeto de la clase
ArrayList y los métodos necesarios para realizar un mantenimiento de impresoras.
import java.util.ArrayList;
// Constructor
public ArregloImpresoras() {
imp = new ArrayList <Impresora> ();
adicionar(new Impresora(4072,23843,"Epson",1350.0));
adicionar(new Impresora(2561,82402,"HP",2300.0));
adicionar(new Impresora(7286,39129,"Samsung",2100.0));
adicionar(new Impresora(9114,50085,"Sony",1900.0));
adicionar(new Impresora(1498,18553,"LG",1050.0));
adicionar(new Impresora(5833,94897,"Samsung",4210.0));
adicionar(new Impresora(8300,42321,"Epson",2090.0));
adicionar(new Impresora(2615,67200,"LG",3520.0));
}
// Operaciones
public void adicionar(Impresora x) {
imp.add(x);
}
Interpretación gráfica
void listar() {
if (ai.tamaño() == 0)
imprimir("el ArrayList de impresoras está vacío");
else {
Impresora x;
imprimir("imp\tcodProd.\tcodBar\tmarca\tprecio");
for (int i=0; i<ai.tamaño(); i++) {
x = ai.obtener(i);
imprimir(i + "\t" + x.getCodProducto()
+ "\t" + x.getCodBarras()
+ "\t" + x.getMarca()
+ "\t" + x.getPrecio());
}
}
}
return null;
}
return null;
}
Diseñe en el programa principal un método que adicione una nueva impresora validando que
los códigos de producto y de barra no se repitan. Los métodos leerCodProducto(),
leerCodBarras(), leerMarca() y leerPrecio() obtienen datos de la GUI. El método mensaje(String)
muestra una ventana emergente por GUI.
Añada en la Clase ArregloImpresoras un método que reciba una marca de impresora y retorne
la referencia al objeto tipo Impresora que la contiene. En caso no exista retorne null.
Diseñe en el programa principal un método que invoque al método anterior para eliminar todas
las impresoras de una determinada marca.
Herencia y Polimorfismo
Dada la Clase abstracta Figura:
Superclase
Figura
largo
ancho
Figura(argumentos)
dimensiones()
area()
tipoFigura()
volumen()
// Constructor
public Figura(double largo, double ancho) {
this.largo = largo;
this.ancho = ancho;
}
// Operaciones
public String dimensiones() {
return "Largo : " + largo + "\n" +
"Ancho : " + ancho;
}
// Métodos abstractos
public abstract String tipoFigura();
Diseñe la Clase hijo Caja que herede de la Clase Padre Figura. A través del Constructor reciba las
dimensiones. Derive las dos primeras a la Clase Padre. Implemente el método sobrescrito
dimensiones() que retorne en una cadena las medidas de la caja y los métodos abstractos que
obliga implementar la Clase Padre.
Subclase
Caja
alto
Caja(argumentos)
dimensiones()
tipoFigura()
volumen()
// Constructor
public Caja(double largo, double ancho, double alto) {
super(largo,ancho);
this.alto = alto;
}
// Operaciones
public String dimensiones() {
return super.dimensiones() + "\n" + "Alto:" + alto;
}
Diseñe la Clase hijo Cubo que herede de la Clase Padre Figura. A través del Constructor reciba el
lado del cuadrado. Derive a la Clase Padre el lado en dos parámetros. Implemente el método
dimension() que retorne en una cadena la medida del lado y los métodos abstractos que obliga
implementar la Clase Padre.
Subclase
Cubo
lado
Cubo(argumentos)
dimension()
tipoFigura()
volumen()
// Constructor
public Cubo(double lado) {
super(lado,lado);
this.lado = lado;
}
// Operaciones
public String dimension() {
return "Lado : " + lado;
}
// Métodos abstractos
public String tipoFigura() {
return "ES UN CUBO";
}
Diseñe en el programa principal un método que declare y cree dos objetos, uno de tipo Caja y
otro de tipo Cubo con datos fijos. Luego a través de un método listado, aplique polimorfismo,
upcasting y downcasting según sea el caso.
void listado(Figura x) {
imprimir("Tipo de figura : " + x.tipoFigura());
if (x instanceof Caja)
imprimir(x.dimensiones());
else
imprimir(((Cubo)x).dimension());
Consideraciones:
Si la Figura recibida es del tipo Caja entonces se ejecuta el método sobrescrito dimensiones() de
la Clase Hijo Caja: es aquí donde el Java aplica upcasting.
Si la Figura recibida es del tipo Cubo entonces para poder ejecutar el método dimension() de la
Clase Hijo Cubo es necesario castear el objeto recibido: es aquí donde el Java aplica downcasting.