Actividad de Aprendizaje Estructura de Datos Unidad 2
Actividad de Aprendizaje Estructura de Datos Unidad 2
Actividad de Aprendizaje Estructura de Datos Unidad 2
1. Cuales son y para que se utilizan los Métodos definidos por Vector
2. Uso de Array de caracteres y cadenas de texto (String y StringBuffer).
Mencione además con que métodos puede trabajar cada una.
3. ¿Cómo Copiar y Comparar Arreglos en Java?
4. Uso de la Clase arrays del API de Java
5. Uso de los métodos arraycopy, Equals, copyof, fill.
6. ¿Cómo Recorrer Arreglos en Java?
7. Uso del Bucle for-each para recorrido de arreglos y colecciones.
6. Realizar un programa que solicite al usuario desde un vector crear una lista de
números por teclado luego imprimir el vector de forma ordenada con el Método
de Burbuja (Descendentemente).
10. Llenar una matriz de 3x3 e Imprima su traspuesta (la traspuesta se consigue
intercambiando filas por columnas y viceversa).
Muchos Éxitos…
Respuestas
1.CLASE VECTOR
Vamos a continuar el estudio de la interface List del api de Java, pero esta vez nos
centraremos en la implementación de esta interface a través de la clase Vector.
También veremos las características más importantes de esta nueva
implementación y haremos un ejemplo a modo de ejercicio.
VECTOR
Vamos a ver las principales características de esta clase, que además es muy
parecida a ArrayList.
Un objeto de tipo Vector contiene elementos que pueden ser accedidos por un
índice y puede aumentar o disminuir su tamaño dinámicamente en tiempo de
ejecución.
@Override
import java.util.Vector;
int i = 0;
while (i<15) {
v.add(new Persona(i,"Persona"+i,i));
i++; }
v.trimToSize();
v.ensureCapacity(50);
System.out.println("La capacidad actual del vector es: "+v.capacity());
2. Java cuenta con múltiples tipos de datos para trabajar con cadenas de
caracteres. El más conocido de ellos es String, pero también tenemos a nuestra
disposición otros como StringBuilder y StringBuffer. Para elegir el más adecuado
en cada caso hemos de conocer las diferencias entre ellos. Es un conocimiento
que nos será útil para mejorar el rendimiento de nuestras aplicaciones y que,
además, podría ayudarnos a responder cuestiones en una entrevista de trabajo en
la que se soliciten conocimientos sobre Java.
¿Por qué existen varios tipos de datos para la misma categoría de información?
Lo primero que habríamos de preguntarnos es la razón por la que existen
múltiples tipos de datos en Java para operar sobre una misma categoría de
información: las cadenas de caracteres.
Todas las ventajas suelen tener asociada una contrapartida y, en este caso
concreto, la desventaja surge al manipular el contenido de una cadena. Dado que
el tipo String es inmutable (no podemos modificar su contenido), cualquier
operación de modificación sobre una variable de este tipo, como puede ser
concatenar una cadena a otra o usar métodos como toUpperCase(), replace() o
similares, implica la creación de un nuevo objeto String como resultado. Por
ejemplo:
saludo.append(" mundo");
En este caso, al agregar la segunda cadena a la primera, sencillamente se
actualiza el contenido inicial de la variable saludo, de tipo StringBuilder, en lugar
de liberarse el objeto original y crearse otro nuevo. En general, un programa que
vaya a modificar con cierta frecuencia el contenido de una o más cadenas de
caracteres obtendrá mejor rendimiento de esta forma que con el tipo String
original.
Como apuntaba antes, habitualmente cada ventaja conlleva algún tipo de
inconveniente. La flexibilidad de los tipos StringBuilder y StringBuffer también tiene
su contrapartida. Al contar con un contenido mutable, StringBuilder no es un tipo
de dato seguro para aplicaciones con múltiples hilos de ejecución. Si dos hilos
acceden simultáneamente para cambiar algo en la cadena, el resultado puede ser
totalmente inesperado.
System.out.println("");
System.out.println("");
System.out.println("");
System.out.println("");
System.out.println ("¿Son el mismo objeto? ... " + (miArray1==otroArray) );
} //Cierre de la clase
Supongamos que queremos comparar la igualdad entre dos arrays. Una idea
(mala idea) podría ser aplicar el método equals directamente sobre el array. Un
código de prueba podría ser este:
System.out.println();
} //Cierre de la clase
import java.util.Arrays;
//Test comparar arrays relación de igualdad aprenderaprogramar.com
public class TestCompararArrays {
public static void main (String [ ] Args) {
int [ ] miArray1 = {2, -4, 3, -7};
for (int i=0; i<miArray1.length; i++) {
System.out.print ("miArray1[" + i +"]= " + miArray1[i]+"; ");}
System.out.println ("");
int [ ] otroArray = {2, -4, 3, -7};
for (int i=0; i<otroArray.length; i++) {
System.out.print ("otroArray[" + i +"]= " + otroArray[i]+"; ");}
System.out.println ("¿Son el mismo objeto? ... " + (miArray1==otroArray) );
System.out.println ("¿Tienen el mismo contenido (relación de igualdad)? ... " +
Arrays.equals(miArray1, otroArray) );
otroArray = miArray1; //otroArray pasa a ser el mismo objeto que miArray1
for (int i=0; i<otroArray.length; i++) { System.out.print ("otroArray[" + i +"]= " + otroArray[i]+";
"); }
System.out.println ("¿Son el mismo objeto? ... " + (miArray1==otroArray) );
System.out.println ("¿Tienen el mismo contenido (relación de igualdad)? ... " +
Arrays.equals(miArray1, otroArray) );
} //Cierre del main
} //Cierre de la clase
Trata de predecir tú mismo el resultado y compáralo con el que ofrecemos.
Resultado:
miArray1[0]= 2; miArray1[1]= -4; miArray1[2]= 3; miArray1[3]= -7;
otroArray[0]= 2; otroArray[1]= -4; otroArray[2]= 3; otroArray[3]= -7; ¿Son el mismo
objeto? ... false
¿Tienen el mismo contenido (relación de igualdad)? ... true
otroArray[0]= 2; otroArray[1]= -4; otroArray[2]= 3; otroArray[3]= -7; ¿Son el mismo
objeto? ... true
¿Tienen el mismo contenido (relación de igualdad)? ... true
El resultado ahora sí es correcto, porque hemos usado correctamente la clase
Arrays para realizar la comparación entre dos arrays.
EJERCICIO EJEMPLO RESUELTO 4. COPIAR CONTENIDOS ENTRE ARRAYS
SIN ESTABLECER RELACIÓN DE IDENTIDAD ( “manual”, aplicable a tipos
primitivos y a objetos).
Antes vimos cómo asignar el contenido de un array a otro haciendo que la variable
apunte al mismo objeto. Vamos a ver ahora cómo copiar el contenido entre dos
arrays pero manteniendo que cada variable denominadora del array apunte a un
objeto diferente:
import java.util.Arrays;
//Test copia arrays con igualdad sin identidad aprenderaprogramar.com
public class TestCopiaConIgualdadSinIdentidad {
public static void main (String [ ] Args) {
int [ ] miArray1 = {2, -4, 3, -7};
for (int i=0; i<miArray1.length; i++) {
System.out.print ("miArray1[" + i +"]= " + miArray1[i]+"; ");}
System.out.println();
int [ ] otroArray = {1, 2, 4, 8};
for (int i=0; i<otroArray.length; i++) {
System.out.print ("otroArray[" + i +"]= " + otroArray[i]+"; ");}
System.out.println ("¿Son el mismo objeto? ... " + (miArray1==otroArray) );
System.out.println ("¿Tienen el mismo contenido (relación de igualdad)? ... " +
Arrays.equals(miArray1, otroArray) );
//Realizamos una asignación elemento a elemento
for (int i=0; i < otroArray.length; i++) {
otroArray[i] = miArray1[i];}
for (int i=0; i < otroArray.length; i++) {
System.out.print ("otroArray[" + i +"]= " + otroArray[i]+"; ");}
System.out.println ("¿Son el mismo objeto? ... " + (miArray1==otroArray) );
System.out.println ("¿Tienen el mismo contenido (relación de igualdad)? ... " +
Arrays.equals(miArray1, otroArray) );
} //Cierre del main
} //Cierre de la clase
Trata de predecir tú mismo el resultado y compáralo con el que ofrecemos.
Resultado:
miArray1[0]= 2; miArray1[1]= -4; miArray1[2]= 3; miArray1[3]= -7;
otroArray[0]= 1; otroArray[1]= 2; otroArray[2]= 4; otroArray[3]= 8; ¿Son el mismo objeto? ...
false
¿Tienen el mismo contenido (relación de igualdad)? ... false
otroArray[0]= 2; otroArray[1]= -4; otroArray[2]= 3; otroArray[3]= -7; ¿Son el mismo
objeto? ... false
¿Tienen el mismo contenido (relación de igualdad)? ... true
EJERCICIO EJEMPLO RESUELTO 5. COPIAR CONTENIDOS ENTRE ARRAYS
SIN ESTABLECER RELACIÓN DE IDENTIDAD (Usando el método copyOf de
la clase Arrays, aplicable a tipos primitivos y a objetos).
El método copyOf de la clase Arrays nos permite:
a) Copiar un array manteniendo el número de elementos.
b) Copiar un array agrandando el número de elementos que tiene, quedando los
nuevos elementos rellenos con valores cero o nulos.
c) Copiar un array empequeñeciendo el número de elementos que tiene; los
elementos que no caben en el nuevo array, dado que tiene menor capacidad, se
pierden (el array queda truncado).
copyOf es un método sobrecargado. En el caso de arrays de enteros su signatura
es la siguiente:
static int[ ] copyOf (int[ ] original, int newLength)
import java.util.Arrays;
//Test uso de copyOf método clase Arrays aprenderaprogramar.com
public class TestUso_copyOf_1 {
public static void main (String [ ] Args) {
int [ ] miArray1 = { 2, -4, 3, -7 };
for (int i=0; i<miArray1.length; i++) {
System.out.print ("miArray1[" + i +"]= " + miArray1[i]+"; ");
}
System.out.println ("");
int [ ] otroArray = { 1, 2, 4, 8 };
for (int i=0; i<otroArray.length; i++) {
System.out.print ("otroArray[" + i +"]= " + otroArray[i]+"; ");
}
System.out.println ("¿Son el mismo objeto? ... " + (miArray1==otroArray) );
System.out.println ("¿Tienen el mismo contenido (relación de igualdad)? ... " +
Arrays.equals(miArray1, otroArray) );
//Copiamos el array utilizando el método copyOf de la clase Arrays
otroArray = Arrays.copyOf(miArray1, miArray1.length);
for (int i=0; i<otroArray.length; i++) {
System.out.print ("otroArray[" + i +"]= " + otroArray[i]+"; "); }
System.out.println ("¿Son el mismo objeto? ... " + (miArray1==otroArray) );
System.out.println ("¿Tienen el mismo contenido (relación de igualdad)? ... " +
Arrays.equals(miArray1, otroArray) );
} //Cierre del main
} //Cierre de la clase
Trata de predecir tú mismo el resultado y compáralo con el que ofrecemos.
Resultado:
miArray1[0]= 2; miArray1[1]= -4; miArray1[2]= 3; miArray1[3]= -7;
otroArray[0]= 1; otroArray[1]= 2; otroArray[2]= 4; otroArray[3]= 8; ¿Son el mismo objeto? ...
false
¿Tienen el mismo contenido (relación de igualdad)? ... false
otroArray[0]= 2; otroArray[1]= -4; otroArray[2]= 3; otroArray[3]= -7; ¿Son el mismo
objeto? ... false
¿Tienen el mismo contenido (relación de igualdad)? ... true
Hemos comprobado que el método copyOf de la clase Arrays realiza una copia
elemento a elemento entre los contenidos de dos arrays pero no hace que los
punteros apunten al mismo objeto. Prueba a variar la longitud que se le pasa como
parámetro al método copyOf, por ejemplo:
otroArray = Arrays.copyOf(miArray1, miArray1.length+2); //Resto del código igual
otroArray = Arrays.copyOf(miArray1, miArray1.length-2); //Resto del código igual
Comprueba que los resultados son el alargamiento del array y su relleno con
ceros, o el acortamiento con pérdida de los datos (truncamiento) que no caben
debido al recorte de la longitud. En el caso de alargamiento o expansión del array
cuando se trata de un array que no sea de enteros, si son tipos numéricos se
rellenan los excedentes con ceros, si son booleanos se rellenan los excedentes
con false, si son char se rellenan de caracteres vacío, y si son objeto se rellenan
los excedentes con null.
RELLENAR UN ARRAY CON UN VALOR U OBJETO. MÉTODO FILL DE LA
CLASE ARRAYS
La clase Arrays tiene un método, denominado fill, sobrecargado, que permite
rellenar un array con un determinado valor u objeto. En el caso de arrays de
enteros la signatura es:
static void fill (int[ ] a, int val)
Asigna el valor entero especificado a cada elemento del array de enteros
indicado.
En general la sintaxis será: Arrays.fill (nombreDelArray, valor con el que se
rellena). El valor con el que se rellena depende del tipo del array. Por ejemplo, si
es un array de tipo booleano, tendremos que rellenarlo bien con true o bien con
false, no podremos rellenarlo con un tipo que no sea coherente. Ejemplos de uso:
Arrays.fill (resultado, ‘9’); Como rellenamos con un carácter, resultado habrá de
ser un array de caracteres, ya que en caso contrario no habría coincidencia de
tipos.
Arrays.fill (permitido, true); Como rellenamos con un true, resultado será un array
de booleanos. De otra manera, no habría coincidencia de tipos. Ejemplo de
código:
import java.util.Arrays;
public class TestMetodoFillArrays {
public static void main (String [ ] Args) { //main cuerpo del programa ejemplo
aprenderaprogramar.com
int [ ] miArray = new int[10];
Arrays.fill(miArray, 33);
for (int tmp: miArray) { System.out.print (tmp + ","); } //Recorrido del array
con un for each
} } //Cierre del main y de la clase
Ejecuta el código y comprueba que el resultado es:
33,33,33,33,33,33,33,33,33,33,. Es decir, el array queda relleno en todos sus
elementos con 33.
En caso de que el array tenga contenidos previos al aplicarle el fill, todos sus
elementos quedarán reemplazados por el elemento de relleno. No obstante, hay
otro método que permite especificar los índices de relleno de modo que se pueda
preservar parte del contenido previo del array:
static void fill (int[ ] a, int fromIndex, int toIndex, int val)
Asigna el valor entero especificado a cada elemento del rango indicado para el
array especificado.
Paso 1
Abre el Ambiente de Desarrollo Integrado de Java Netbeans (IDE, por sus siglas
en inglés).
Paso 2
Haz clic en "Archivo" y "Crear nueva clase". Nombra la clase
"TwoDimensionalArray" cuando se te indique.
Paso 3
Pega el siguiente código dentro de los corchetes del método "main", para definir
un arreglo de dos dimensiones:
Paso 4
Pega lo siguiente en la próxima línea para acceder a la primera columna, segunda
fila del arreglo:
Recuerda que Java empieza a contar desde "0", de modo que la primera columna
es la "0", y la segunda fila es la columna "1".
Paso 5
Pega lo siguiente en la próxima línea para recorrer el arreglo entero:
for(int x = 0; x < matrix.length; x++) { for (int y = 0; y < matrix[x].length; y++) { int
currentCell = matrix[x][y]; } }
7. Una de las cosas que incorporó Java 5 fue el bucle for-each en Java. Esta
estructura nos permite recorrer una Colección o un array de elementos de una
forma sencilla. Evitando el uso de Iteradores o de un bucle for normal.
En este caso nos estamos apoyando en el tamaño del array, con la propiedad
length y en una variable contador, la cual vamos incrementando hasta que llegue a
el tamaño del array.
Para recorrer una Colección, una lista en este caso, podríamos hacerlo con un
Iterador de la siguiente forma:
List<String> list = new ArrayList<String>();
// Añadimos elementos
list.add("Victor");
list.add("Amaya");
list.add("Julio");
// Añadimos elementos
list.add("Victor");
list.add("Amaya");
list.add("Julio");
https://www.aprenderaprogramar.com/index.php?
option=com_content&view=article&id=606:la-clase-vector-del-api-java-metodos-
trimtosize-y-ensurecapacity-ejemplo-y-ejercicios-resueltos-
cu00922c&catid=58&Itemid=180
https://www.campusmvp.es/recursos/post/cadenas-mutables-e-inmutables-en-
java-cuando-usar-string-stringbuilder-y-stringbuffer.aspx
https://www.aprenderaprogramar.com/index.php?
option=com_content&view=article&id=641:copiar-y-comparar-arrays-en-java-
conceptos-identidad-e-igualdad-ejercicios-resueltos-ejemplos-
cu00675b&catid=68&Itemid=188
https://www.aprenderaprogramar.com/index.php?
option=com_content&view=article&id=642:clase-arrays-del-api-java-metodos-
equals-comparar-copyof-copiar-fill-rellenar-ejemplos-
cu00676b&catid=68&Itemid=188
https://techlandia.com/recorrer-arreglos-dimensiones-java-como_254131/
http://lineadecodigo.com/java/bucle-for-each-en-java/