Download Estructuras de datos en Java

Document related concepts
no text concepts found
Transcript
Estructuras de datos en Java
Estructuras de datos en Java
Luis Felipe Wanumen Silva
Laura Ximena García Vaca
Darín Jairo Mosquera Palacios
Dirigido a estudiantes de ingeniería, tecnólogos y técnicos en programación
© Universidad Distrital Francisco José de Caldas
©Facultad de Tecnología
©Luis Felipe Wanumen Silva, Laura Ximena García Vaca,
Darín Jairo Mosquera Palacios
Primera edición, abril de 2017
ISBN: 978-958-5434-19-6
Dirección Sección de Publicaciones
Rubén Eliécer Carvajalino C.
Coordinación editorial
Nathalie De la Cuadra N.
Corrección de estilo
Lilia Carvajal Ahumada
Diagramación
Astrid Prieto Castillo
Editorial UD
Universidad Distrital Francisco José de Caldas
Carrera 24 No. 34-37
Teléfono: 3239300 ext. 6202
Correo electrónico: [email protected]
Estructuras de datos en Java / Darín Jairo Mosquera Palacios y
otros. -- Bogotá: Universidad Distrital Francisco José de
Caldas, 2017.
234 páginas ; 24 cm.
ISBN 978-958-5434-19-6
Ingeniería de sistemas 2. Java (Lenguaje de programación
de computadores) 3. Lenguajes de programación (Computadores)
1. Mosquera Palacios, Darín Jairo, autor.
005.133 cd 21 ed.
A1568625
CEP-Banco de la República-Biblioteca Luis Ángel Arango
Todos los derechos reservados.
Esta obra no puede ser reproducida sin el permiso previo escrito de la
Sección de Publicaciones de la Universidad Distrital.
Hecho en Colombia
Contenido
Introducción...............................................................................13
Tipos abstractos de datos................................................................15
Concepto de TAD....................................................................................... 15
Concepto de estructuras.............................................................................. 15
Estructuras estáticas de datos: arreglos, vectores o arrays.......................19
Introducción a los arreglos.......................................................................... 19
Impresión del contenido de un arreglo......................................................... 21
Problemas con dimensiones de arreglos y utilización de length..................... 21
Cómo llenar un vector posición por posición................................................ 22
Tablas de multiplicar................................................................................... 24
Arreglos con tamaño predeterminado.......................................................... 24
Arreglos tipo integer.................................................................................... 26
Arreglos string............................................................................................ 26
Uso de las referencias a arreglos.................................................................. 27
Referencias y arrays.................................................................................... 28
Punteros C/C++ y referencias Java............................................................. 29
Ordenar un vector....................................................................................... 30
Suma de posiciones pares e impares............................................................. 31
Búsqueda en un vector desordenado............................................................ 33
Prueba de escritorio.................................................................................... 35
Ordenar un arreglo de string con collection.................................................. 39
Definir y utilizar vectores dinámicos............................................................ 40
Ejercicios.................................................................................................... 41
Estructuras estáticas de datos: matrices.............................................45
Creación, inicio e impresión de matriz tipo int y no dinámica....................... 45
Creación, inicio e impresión de matriz tipo int y dinámica........................... 46
Programa que pide cada uno de los valores de una matriz............................ 47
Programa que calcula la transpuesta de una matriz...................................... 50
Matriz mágica............................................................................................ 55
Matriz de TextField..................................................................................... 58
Triangulares y diagonales de una matriz...................................................... 61
Programa que pone 15 minas en una matriz................................................. 63
Ejercicios ................................................................................................... 65
Estructuras dinámicas de datos: listas en Java......................................67
Concepto de lista........................................................................................ 67
Primera lista lineal en Java.......................................................................... 68
Ejemplo de listas lineales en Java................................................................. 71
Captura y visualización de datos de una lista............................................... 76
Listas lineales con nodo cabeza de control vacío.......................................... 79
Inserción de datos en una lista en un nodo específico................................... 82
Ejercicios ................................................................................................... 91
Listas sencillas circulares...............................................................93
Concepto de listas circulares........................................................................ 93
Listas circulares con nodo cabeza de control................................................ 96
Lista sencilla con tamaño dado por el usuario.............................................. 98
Ejercicios ................................................................................................... 100
Pilas en Java...............................................................................103
Concepto de pila......................................................................................... 103
Ejemplo conceptual de pila......................................................................... 103
Funciones push y pop de la clase stack......................................................... 105
Uso de la funcion peek de la clase stack....................................................... 109
Uso de la función boolean empty de la clase stack........................................ 111
Uso de la función int search de la clase stack................................................ 112
Ejercicios ................................................................................................... 114
Teoría sobre árboles binarios...........................................................115
Definición de árboles binarios..................................................................... 115
Nodos no terminales y terminales................................................................ 116
Hoja........................................................................................................... 116
Camino...................................................................................................... 117
Longitud..................................................................................................... 118
Ejercicios.................................................................................................... 119
Algoritmos básicos sobre árboles binarios...........................................121
Imprimir un árbol binario llenado forzadamente.......................................... 121
Árbol binario sin recursividad...................................................................... 127
Ejercicios.................................................................................................... 134
Recorrido en árboles binarios..........................................................135
Conceptos.................................................................................................. 135
Árbol binario: pre- in- y posorden y llenado por el usuario............................ 136
Ejercicios ................................................................................................... 146
Aplicaciones sobre árboles binarios...................................................147
Establecer si dos árboles binarios son iguales............................................... 147
Algoritmo de solución................................................................................. 148
Contar los nodos en árboles binarios............................................................ 150
Algoritmo de solución................................................................................. 150
Determinar si dos árboles binarios son semejantes....................................... 152
Algoritmo de solución................................................................................. 153
Determinar si dos árboles binarios son isomorfos......................................... 155
Determinar la altura de un árbol binario...................................................... 156
Determinar si un árbol binario es completo.................................................. 159
Ver si un árbol binario es completo y lleno a la vez....................................... 172
Crear y graficar un árbol binario.................................................................. 181
Ejercicios ................................................................................................... 187
Árboles jerárquicos en Java.............................................................189
Agregar hijos al árbol.................................................................................. 190
Mostrar texto del último nodo seleccionado................................................. 192
Dejar visible el último nodo seleccionado.................................................... 197
Poner manipulador de nodo raíz.................................................................. 201
Mostrar y ocultar el nodo raíz..................................................................... 203
Poner y retirar el foco en el árbol................................................................. 207
Ejercicios.................................................................................................... 209
Conceptos sobre grafos..................................................................211
Definicion de grafo..................................................................................... 211
Lazos......................................................................................................... 212
Aristas múltiples......................................................................................... 212
Grado de un vértice.................................................................................... 213
Notación de vértices y aristas...................................................................... 214
Vértices adyacentes..................................................................................... 216
Creación de un grafo en Java....................................................................... 217
Ejercicios ................................................................................................... 232
Bibliografía................................................................................233
Introducción
Las notas de clase del curso Estructuras de Datos ofrecen al lector una exposición
clara de los conceptos básicos de estructuras y árboles. Para el desarrollo de este
curso se supone que el lector ya está familiarizado con fundamentos de Java como
las variables, los autónomos y applets, las principales clases que encapsulan tipos
primitivos, las cuestiones básicas de la interfaz gráfica, etc.
Se dedican especiales esfuerzos a explicar las listas, debido a que este es el primer
tema que muchos profesores y autores de libros tratan en cursos de estructuras en
cualquier lenguaje de programación.
Por otra parte, se muestra el manejo de las pilas por medio de la clase stack,
que incopora Java y que ayuda indudablemente a que este no sea en sí un tema
tan complicado como en otros lenguajes. Asimismo, se muestran ampliamente los
conceptos y el uso de árboles binarios.
El documento se estructura por capítulos siguiendo una lógica académica. Se
parte de los conceptos básicos de tipos abstractos de datos en el capítulo uno, de tal
suerte que con ello se obtiene una visión sobre las estructuras de datos.
En el segundo capítulo se profundiza en el manejo y creación de estructuras de
datos estáticas entre las que se encuentran los arreglos. Este tipo de datos se tratan debido a que técnicamente son estructura de datos. Algunos autores no incluyen estos
temas porque consideran que el estudiante ha visto y conoce las estructuras estáticas,
sin embargo incluirlos ayuda a conseguir las habilidades necesarias para comprender
cualquier texto inicial de estructuras de datos.
El tercer capítulo profundiza en la estructura de datos estática llamada «matriz»,
con el ánimo de mejorar la algoritmia del lector y de permitir que adquiera a través
de ejemplos la lógica de programación necesaria para afrontar los futuros usos que
las matrices tienen en estructuras de datos complejas como los grafos. Aunque este
es un tema avanzado y por lo tanto no se trata con amplitud, se dejan al lector los elementos necesarios para que pueda comprenderlos fácilmente cuando se enfrente a él.
Los capítulos cuatro y cinco tratan las listas, porque potencialmente pueden
tener los mismos usos que los vectores, y la forma como se implementan mejora el
rendimiento de las aplicaciones porque optimiza el uso de los recursos en relación
con estos.
13
Luis Felipe Wanumen Silva, Laura Ximena García Vaca, Darín Jairo Mosquera Palacios
El capítulo seis analiza las pilas. Para ello se aprovechan las API propias de Java
que permiten que el lector fácilmente las implemente. Se deja como tarea hacerlo
sin el uso de las API de Java. De igual manera se muestra cómo algunas estructuras
de datos son más rápidas de utilizar en lenguajes como Java si se compara con otros
como C o C++.
Los capítulos siete, ocho, nueve, diez y once tratan aspectos importantes sobre
los árboles binarios y las dos formas para implementarlos: la «artesanal», es decir,
usando toda la lógica de árboles desde cero, y el reuso de API, en el que se observan
algunas utilidades provistas por la plataforma Java para su manejo, y se aplica a fin
de dar al lector una visión sobre las posibilidades que ofrece Java para implementar
árboles binarios y n-arios. Hay que anotar que no se profundiza en los árboles n-arios
por ser este tema un tema digno de trabajar en un segundo libro de estructuras de
datos avanzadas.
El capítulo doce trabaja superficialmente los temas teóricos de grafos, sin embargo esto se hace a manera de introducción. Se plantean ejercicios para lograr que el
estudiante avance sobre ello de forma autodidacta.
14
Tipos abstractos de datos
Concepto de TAD
En una aplicación de software podemos diferenciar claramente dos aspectos importantes: la interfaz de usuario y los procesos internos de la aplicación.
La interfaz de usuario en realidad es la parte más importante a corto tiempo
para lograr que la aplicación sea atractiva al usuario. Pero a largo plazo lo único que
garantiza que la aplicación perdure es la forma como se implementan sus procesos
internos, ello requiere algunas operaciones y unas estructuras que serán las encargadas de almacenar la información sobre la cual se van a realizar las operaciones. Una
muy buena alternativa para modelar software son los objetos abstractos que incluyan
operaciones y estructuras en entes autónomos, autosuficientes y cerrados. Estos entes
se conocen como tipos abstractos de datos (TAD).
Concepto de estructuras
En Java existen algunas formas simples de almacenar información. La primera es utilizando variables. Era en estas pequeñas áreas de memoria referenciadas por dichas
variables en donde se almacenaban algunos datos. Por el tipo de datos tan primitivos
que se pueden almacenar, se denominaban “variables de tipos primitivos de datos”.
Con la llegada de lenguajes adelantados en programación orientados a objetos,
se pensó en crear formas de almacenar y contener tipos primitivos de datos —que
sirvieran como capa envolvente para encapsular también operaciones de conversión
sobre estos datos—, y que se les denominó “objetos de tipos de datos”.
Ahora bien, tanto para el caso de “tipos primitivos de datos” como para el caso
de “objetos de tipos de datos”, se pueden construir estructuras más complejas que
permitan crear arreglos de múltiples dimensiones basados en tipos primitivos o en
objetos de tipos de datos. Recordemos por ejemplo que en Java una forma de crear
una estructura compuesta de tres dimensiones asociada con la variable “tabla” y donde la primera dimensión tiene un tamaño máximo de 4, la segunda de 6 y la tercera
de 5 es la siguiente:
int tabla[][][] = new int[4][6][5];
15
Luis Felipe Wanumen Silva, Laura Ximena García Vaca, Darín Jairo Mosquera Palacios
A este tipo de implementaciones se les conoce con el nombre de estructuras compuestas, sin embargo a pesar de las ventajas que presenta trabajar con ellas, en algunos casos se necesita una representación más amplia de dicha estructura, en la cual
sea posible añadir un elemento en medio de unos dos elementos específicos, y que
la memoria utilizada por el mismo elemento sea liberada en tiempo de ejecución de
la aplicación. Para lograr estas facilidades tenemos que recurrir a estructuras mucho
más completas y dinámicas, es decir, que puedan adquirirse recursos de memoria
cuando se necesiten y viceversa, que estos puedan eliminarse cuando no sean necesarios.
Tenemos una primera clasificación de las estructuras de datos en “estructuras
estáticas de datos” y en “estructuras de datos dinámicas”.
Estructura de datos
Estructura estadística de datos
Estructura de datos dinámica
Surge entonces el concepto de estructuras dinámicas, que no son más que la colección de varios elementos abstractos de datos autónomos en forma relacionada. A
dichos elementos se les denomina por lo general “nodos de la estructura”.
Veamos de forma gráfica todo lo expuesto anteriormente:
“N” Nodos relacionados entre sí
Nodo D
Estructura
dinámica
Nodo A
Nodo F
Nodo I
Nodo B
Nodo G
Nodo E
Nodo X
Nodo H
Nodo C
De acuerdo con el tipo de relaciones que tengan los nodos podremos especificar concretamente qué tipo de estructura dinámica es. En el siguiente gráfico se muestran
algunas de las más conocidas subdivisiones de las estructuras dinámicas.
16
Estructuras de datos en Java
Estructuras de datos
Lineales
Listas
Colas
No Lineales
Pilas
Árboles
Grafos
17
Estructuras estáticas de datos:
arreglos, vectores o arrays
Introducción a los arreglos
A los arreglos comúnmente se les denomina “arrays”, y también “vectores”. Por
experiencia podemos asegurar que son lo mismo. Se puso este item así con el fin de
lograr que el usuario de este material pueda encontrar fácilmente los temas, dependiendo de cómo le llame a los arreglos.
Los arreglos en Java son siempre dinámicos por lo que no es necesario que el
programador ponga la longitud. Es más, si lo hace se produce un error cuando se
compile el programa.
Forma correcta de declarar un arreglo
int arreglo[]
Forma incorrecta de declarar un arreglo
int arreglo[3]
Otra forma correcta de declarar un arreglo
int[] arreglo
En esta última forma usamos los corchetes en el tipo de dato de la variable. Para
comprender mejor esto veamos el ejemplo:
import java.awt.*;
import java.applet.*;
public class MyApp extends Applet
{
int arreglo[] = {25,14};
public void paint(Graphics g)
{
g.drawString(“Posición Cero: “+arreglo[0], 20, 20);
g.drawString(“Posición Uno: “+arreglo[1], 20, 40);
}
}
19
Luis Felipe Wanumen Silva, Laura Ximena García Vaca, Darín Jairo Mosquera Palacios
El programa anterior produce el siguiente resultado en el navegador:
Posición cero: 25
Posición uno: 14.
Observemos que si hubieramos reemplazado la línea de código:
int arreglo[] = {25,14};
por la línea de código
int arreglo[2] = {25,14};
se habría producido un error en la aplicación, debido a que estábamos tratando de
especificar con anterioridad la dimensión del arreglo, vector, array o como le llame
el estudiante.
En Java se pueden declarar arrays de cualquier tipo:
char s[];
int iArray[];
Incluso se pueden construir arrays de arrays:
int tabla[][] = new int[4][5];
Los límites de los arrays se comprueban en tiempo de ejecución para evitar desbordamientos y la corrupción de la memoria.
En Java un array es realmente un objeto, porque tiene redefinido el operador [].
Tiene una función miembro length. Se puede utilizar este método para conocer la
longitud de cualquier array.
int a[][] = new int[10][3];
a.length;
/* 10 */
a[0].length;
/* 3 */
Para crear un array en Java hay dos métodos básicos; crear uno vacío,
int lista[] = new int[50];
O con sus valores iniciales:
String nombres[] = {
“Juan”,”Pepe”,”Pedro”,”Maria”
};
Esto es equivalente a:
String nombres[];
nombres = new String[4];
nombres[0] = new String(
nombres[1] = new String(
nombres[2] = new String(
nombres[3] = new String(
“Juan” );
“Pepe” );
“Pedro” );
“Maria” );
No se pueden crear arrays estáticos en tiempo de compilación:
int lista[50];
// generará un error en tiempo de compilación
Tampoco se puede rellenar un array sin declarar el tamaño con el operador new:
int lista[];
for( int i=0; i < 9; i++ )
lista[i] = i;
20
Estructuras de datos en Java
Es decir, todos los arrays en Java son estáticos. Para convertir un array en el equivalente dinámico en C/C++, se usa la clase vector, que permite en él operaciones de
inserción, borrado, etc.
Impresión del contenido de un arreglo
Para lograr más claridad en los temas vistos, se plantea este programa:
import java.awt.*;
import java.applet.*;
public class MyApp extends Applet
{
int arreglo[] = {0,1,2,3,4,5,6,7,8,9,10},
max = 10, inicio, valor;
public void paint(Graphics g)
{
for (inicio = 0; inicio<=max; inicio++)
{
valor = 10*(inicio+1);
g.drawString(«arreglo[«+inicio+»] = «+arreglo[inicio],3, valor);
}
}
}
El cual arroja el siguiente resultado:
arreglo[0] = 0
arreglo[1] = 1
arreglo[2] = 2
arreglo[3] = 3
arreglo[4] = 4
arreglo[5] = 5
arreglo[6] = 6
arreglo[7] = 7
arreglo[8] = 8
arreglo[9] = 9
arreglo[10] = 10
Problemas con dimensiones de arreglos y utilización de length
Como se ha mencionado anteriormente en varias ocasiones, es posible definir un
arreglo mediante la instrucción:
int arreglo[] = new int[4];
Pero hay que tener un gran cuidado con esto en el momento de asignarle valores a
dicho arreglo, es decir, se le puede asignar valor a “arreglo[0]”, “arreglo[1]”, “arreglo[2]” y “arreglo[3]”, pero no es posible asignarle valores a “arreglo[4]”, debido a
que la longitud del arreglo es de 4. Para entenderlo mejor a continuación mostramos
un programa que presenta un problema y por lo tanto no alcanza a imprimir los valores del arreglo. Veamos:
21
Luis Felipe Wanumen Silva, Laura Ximena García Vaca, Darín Jairo Mosquera Palacios
import java.awt.*;
import java.applet.*;
public class MyApp extends Applet
{
int arreglo[] = new int[4];
public void paint(Graphics g)
{
for(int k = 0; k<5;k++){
arreglo[k]=k;
}
for(int h = 0; h<5;h++){
g.drawString(«arreglo[«+h+»]=»+arreglo[h],20,60+h*10);
}
}
}
Para corregirlo es necesario saber el tamaño del arreglo que se ha declarado, con
el fin de asignarle valores a posiciones del arreglo válidas. Esto se puede hacer mediante la función “length”, que captura el tamaño del arreglo. A continuación se
muestra la correción del ejercicio anterior:
import java.awt.*;
import java.applet.*;
public class MyApp extends Applet
{
int arreglo[] = new int[4];
public void paint(Graphics g)
{
g.drawString(«Hello World ee», 20, 20);
for(int k = 0; k<arreglo.length;k++){
arreglo[k]=k;
}
for(int h = 0; h<arreglo.length;h++){
g.drawString(«arreglo[«+h+»]=»+arreglo[h],20,60+h*10);
}
}
}
Cómo llenar un vector posición por posición
En algunos casos es posible que se quiera hacer un programa que vaya capturando
números o datos de forma cíclica, de tal suerte que al final del ciclo se haya llenado
un vector. Este ejercicio, pese a lo sencillo, es escaso de encontrar en textos de Java,
razón por la cual se expone a continuación con el fin de lograr que el lector tenga la
mayor cantidad de material para lograr variado tipo de aplicaciones. Veamos:
22
Estructuras de datos en Java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MyApp extends JFrame implements java.awt.event.ActionListener
{
JLabel label1 = new JLabel(«Digite Número»);
JTextField texto1 = new JTextField(10);
JButton boton1 = new JButton(«CAPTURAR»);
JTextField texto3 = new JTextField(10);
int x[]=new int [6];
int aux=0;
public MyApp()
{
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
dispose();
System.exit(0);
}
});
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setLayout(new GridLayout(2,2,20,20));
}
getContentPane().add(label1);
getContentPane().add(texto1);
getContentPane().add(boton1);
getContentPane().add(texto3);
texto3.setVisible(false);
boton1.addActionListener(this);
public void actionPerformed(ActionEvent ev)
{
if(ev.getSource()==boton1)
{ if(aux<6)
{
String aux2 = new String(texto1.getText());
String aux3 = new String(aux2.trim());
x[aux] = Integer.parseInt(aux3);
//x[aux]=Integer.parseInt(texto1.getText().trim());
texto1.setText(«»);
aux++;
} // Cierra while
} // Cierra if boton = boton1
if(aux==6){
texto1.setVisible(false);
texto3.setVisible(true);
texto3.setText(«»);
label1.setText(«El vector es:»);
for(int i=0; i<aux; i++){
String aux1 = new String(texto3.getText());
texto3.setText(aux1.concat(« «+x[i]));
boton1.setText(«FIN»);
}
23
Luis Felipe Wanumen Silva, Laura Ximena García Vaca, Darín Jairo Mosquera Palacios
}
} // Cierra actionPerformed()
public static void main(String args[])
{
System.out.println(«Starting App»);
MyApp f = new MyApp();
f.setSize(450,300);
f.show();
} // Cierra función main()
} // Cierra class MyApp
El programa espera que el usuario digite un número, después de lo cual debe presionar el botón “capturar” y repetir esta operación seis veces, luego se muestra en una
caja de texto adicional los valores previamente insertados, se deshabilita la caja de
texto inicial y se le cambia el texto al botón indicando que finalizó el programa1.
Tablas de multiplicar
import java.awt.*;
import java.applet.*;
public class MyApp extends Applet
{
int arreglo[];
int inicio, inicio1, valory, valorx, max =10;
public void paint(Graphics g)
{
g.drawString(«Programa: Tablas de Multiplicar», 20, 150);
g.drawString(«Elaborado por el profesor: «, 20, 160);
g.drawString(«Luis Felipe Wanumen Silva «, 20, 170);
g.drawString(«Para dictar clase «, 20, 180);
for(inicio=0; inicio<=max; inicio++){
valory = 10*(inicio+1);
g.drawString(«Tabla del «+inicio,valory*6-50,10);
for(inicio1=0; inicio1<=max; inicio1++){
valorx = 60*(inicio1+1);
g.drawString(«»+inicio1+»*»+inicio+»=»+(inicio1*inicio),valorx-50,valory+20);
}
}
}
}
Arreglos con tamaño predeterminado
En secciones anteriores veíamos que era imposible escribir líneas como esta:
int arreglo[2] = {25,14};
1
Más ejercicios sobre este tipo de estructuras estáticas se pueden encontrar en [1].
24
Estructuras de datos en Java
Ello se debe básicamente a que en Java todas las variables son dinámicas, pero se
puede hacer de la siguiente manera:
int[] miarreglo = new int[5];
A continuación se muestra un programilla applet que utiliza esta forma de crear un
arreglo con una longitud predeterminada y posteriormente le pone e imprime su
contenido mediante un ciclo for. Veamos pues:
import java.awt.*;
import java.applet.*;
public class MyApp extends Applet
{
int[] miarreglo = new int[5];
public void paint(Graphics g)
{
for (int k = 0; k < miarreglo.length; k++) {
miarreglo[k] = k;
g.drawString(«[k] = « + miarreglo[k], 20, (k+10)*k);
}
}
}
Cabe anotar que el manejo para los arreglos de tipo flota, doble, es similar al anterior,
así que no creo que merezcan especial atención, no obstante a continuación se muestra un programa en el que se hacen arreglos de este tipo, con el fin de lograr claridad
sobre ello.
import java.awt.*;
import java.applet.*;
public class MyApp extends Applet
{
double[] miarreglo_double = new double[7];
float[] miarreglo_float = new float[7];
long[] miarreglo_long = new long[7];
public void paint(Graphics g)
{
for (int k = 0; k < miarreglo_double.length; k++) {
miarreglo_double[k] = k;
miarreglo_float[k] = miarreglo_float.length - k;
miarreglo_long[k] = (miarreglo_float.length - k)*2;
g.drawString(«[k] = « + miarreglo_double[k], 20,
(k+10)*k);
g.drawString(«[k] = « + miarreglo_float[k], 60, (k+10)*k);
g.drawString(«[k] = « + miarreglo_long[k], 100, (k+10)*k);
}
}
}
Bueno, ahora usted, amigo lector, se preguntará, ¿qué pasa con los arreglos de string?
Dado que los string son objetos y un string no es un dato primitivo, sino un tipo de
objeto de dato, tenemos que tratarlo de forma diferente. Por ello más adelante se
estudiará con detalle.
25
Luis Felipe Wanumen Silva, Laura Ximena García Vaca, Darín Jairo Mosquera Palacios
Arreglos tipo integer
Los arreglos tipo integer son diferentes a los int básicamente en concepto, debido a
que los primeros son de objetos integer y los segundos son de variables int; de todas
formas los int por el simple hecho de ser arreglos ya tienen comportamientos de objeto y esto queda claro cuando se utiliza la función “length” en un arreglo tipo “int”,
tal como se muestra a continuación:
int arreglo[] = new int[4];
for(int k = 0; k<arreglo.length;k++){
arreglo[k]=k;
}
Ahora bien, fijémonos en que la asignación se hace directamente sobre la posición
que se quiera del arreglo, cosa que varía notablemente en los arreglos tipo “integer”,
en los cuales la asignación se hace mediante la palabra reservada “new”. Para
comprender mejor esto, veamos el siguiente programa applet de ejemplo:
import java.awt.*;
import java.applet.*;
public class MyApp extends Applet
{
Integer arreglo[] = new Integer [4];
public void paint(Graphics g)
{
g.drawString(«Hello World ee», 20, 20);
for(int k = 0; k<arreglo.length;k++){
arreglo[k]= new Integer(k);
}
for(int h = 0; h<arreglo.length;h++){
g.drawString(«arreglo[«+h+»]=»+arreglo[h],20,60+h*10);
}
}
}
Arreglos string
Estabamos estudiando los arreglos de algunos tipos como int, long, flota y double,
pero ahora veamos como son los del tipo string.
Empecemos por decir que para declarar un array de string se escribe:
String[] arraydeobjetosString = new String[3];
La gran diferencia radica en el contenido de los elementos de este array, que son
referencias a un objeto de tipo string. Ojo, en cada elemento de este array no se encuentra un objeto string, sino una referencia a un objeto de tipo string, con lo cual es
necesario iniciar cada posición como se muestra a continuación:
ArraydeobjetosString[0] = new String(“Cadena1”);
ArraydeobjetosString[1] = new String(“Cadena2”);
ArraydeobjetosString[2] = new String(“Cadena3”);
26