Estructura de datos

Práctica 1: Listas encadenadas

Objetivos

Durante esta práctica, los alumnos serán capaces de:

Esta actividad promueve las siguientes habilidades, valores y actitudes: análisis y síntesis, capacidad de resolver problemas, y uso eficiente de la informática y las telecomunicaciones.

Descripción de la actividad

Esta práctica puede ser elaborada de manera individual o en parejas.

Escribe una clase en Java llamada mx.itesm.cem.listasencadenas.TecLinkedList<E> que extienda de la clase java.util.AbstractList<E>. Esta clase debe ser implementada usando una lista lineal sencillamente encadenada con un nodo centinela.

A continuación se listan los métodos que la clase debe implementar. El comportamiento de dichos métodos debe corresponder a lo que está documentado en el API de la clase java.util.AbstractList<E>.

Así mismo, la clase debe contar con un constructor que reciba un número variable de argumentos con los que se debe inicializar la instancia siendo creada.

Prueba tu código con las siguientes pruebas unitarias:

package mx.itesm.cem.listasencadenas;

import static org.junit.jupiter.api.Assertions.*;

import java.util.List;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class TecLinkedListTest {

    private List<String> stringList;
    private List<Integer> integerList;
    private List<Float> floatList;

    @BeforeEach
    void setUp() throws Exception {
        stringList = new TecLinkedList<>("Katniss", "Peeta",
                "Gale", "Haymitch", "Primrose", "Effie");
        integerList = new TecLinkedList<>(0, 1, 1, 2, 3, 5,
                8, 13, 21, 34, 55, 89);
        floatList = new TecLinkedList<>();
    }

    @Test
    void testSize() {
        assertEquals(6, stringList.size());
        assertEquals(12, integerList.size());
        assertEquals(0, floatList.size());
    }

    @Test
    void testGet() {
        assertEquals("Katniss", stringList.get(0));
        assertEquals("Effie", stringList.get(5));
        assertThrows(IndexOutOfBoundsException.class,
                () -> stringList.get(6));
        assertThrows(IndexOutOfBoundsException.class,
                () -> stringList.get(-1));

        assertEquals(5, (int) integerList.get(5));
        assertEquals(55, (int) integerList.get(10));
        assertThrows(IndexOutOfBoundsException.class,
                () -> integerList.get(12));

        assertThrows(IndexOutOfBoundsException.class,
                () -> floatList.get(0));
    }

    @Test
    void testSet() {
        assertEquals("Effie", stringList.set(5, "Cinna"));
        assertEquals("Haymitch",
                stringList.set(3, "Portia"));
        assertEquals("Peeta", stringList.set(1, "Flavius"));
        assertThrows(IndexOutOfBoundsException.class,
                () -> stringList.set(6, "Coriolanus"));
        assertThrows(IndexOutOfBoundsException.class,
                () -> stringList.set(-1, "Rue"));
        assertIterableEquals(
                List.of("Katniss", "Flavius", "Gale",
                        "Portia", "Primrose", "Cinna"),
                stringList);

        assertEquals(0, (int) integerList.set(0, -1));
        assertEquals(3, (int) integerList.set(4, 4));
        assertEquals(89, (int) integerList.set(11, 88));
        assertThrows(IndexOutOfBoundsException.class,
                () -> integerList.set(12, 1729));
        assertIterableEquals(List.of(-1, 1, 1, 2, 4, 5, 8,
                13, 21, 34, 55, 88), integerList);

        assertThrows(IndexOutOfBoundsException.class,
                () -> floatList.set(0, 6.022140857e23F));
    }

    @Test
    void testAdd() {
        stringList.add(0, "Buttercup");
        assertEquals(7, stringList.size());
        stringList.add(7, "Seneca");
        assertEquals(8, stringList.size());
        stringList.add(5, "Octavia");
        assertEquals(9, stringList.size());
        assertThrows(IndexOutOfBoundsException.class,
                () -> stringList.add(10, "Venia"));
        assertThrows(IndexOutOfBoundsException.class,
                () -> stringList.add(-1, "Venia"));
        assertIterableEquals(
                List.of("Buttercup", "Katniss", "Peeta",
                        "Gale", "Haymitch", "Octavia",
                        "Primrose", "Effie", "Seneca"),
                stringList);

        integerList.add(0, 0);
        integerList.add(144);
        assertEquals(14, integerList.size());
        assertThrows(IndexOutOfBoundsException.class,
                () -> integerList.add(15, 233));
        assertIterableEquals(List.of(0, 0, 1, 1, 2, 3, 5, 8,
                13, 21, 34, 55, 89, 144), integerList);

        assertThrows(IndexOutOfBoundsException.class,
                () -> floatList.add(1, 3.35988F));
        floatList.add(0, 1.30357F);
        floatList.add(1, 1.41421F);
        floatList.add(1, 1.61803F);
        assertEquals(3, floatList.size());
        assertIterableEquals(
                List.of(1.30357F, 1.61803F, 1.41421F),
                floatList);
    }

    @Test
    void testRemove() {
        assertEquals("Katniss", stringList.remove(0));
        assertEquals(5, stringList.size());
        assertEquals("Peeta", stringList.remove(0));
        assertEquals(4, stringList.size());
        assertEquals("Effie", stringList.remove(3));
        assertEquals(3, stringList.size());
        assertEquals("Haymitch", stringList.remove(1));
        assertEquals(2, stringList.size());
        assertThrows(IndexOutOfBoundsException.class,
                () -> stringList.remove(2));
        assertThrows(IndexOutOfBoundsException.class,
                () -> stringList.remove(-1));
        assertIterableEquals(List.of("Gale", "Primrose"),
                stringList);

        for (int x : List.of(0, 1, 1, 2, 3, 5, 8, 13, 21,
                34, 55, 89)) {
            assertEquals(x, (int) integerList.remove(0));
        }
        assertThrows(IndexOutOfBoundsException.class,
                () -> integerList.remove(0));
        assertEquals(0, integerList.size());
        assertIterableEquals(List.of(), integerList);

        assertThrows(IndexOutOfBoundsException.class,
                () -> floatList.remove(0));
    }
}

¿Qué se debe entregar?

Tu archivo fuente de Java debe comenzar con un comentario que contenga el título de la práctica, la fecha y los datos personales de los autores (nombre y matrícula). Por ejemplo:

/*----------------------------------------------------------
 * Práctica 1: Listas encadenadas
 * Fecha: 02-Feb-2018
 * Autores:
 *           A01166611 Pepper Pots
 *           A01160611 Anthony Stark
 *----------------------------------------------------------*/

Instrucciones para subir archivo

Para entregar el archivo TecLinkedList.java, ingresa los siguientes datos:

Solicitar NIP

Si la práctica fue desarrollada en pareja, basta que solo uno de los miembros la entregue.

La fecha límite es el viernes 2 de febrero.

Evaluación

Esta actividad será evaluada usando los siguientes criterios:

-10 No se incluyó en comentario los datos de los autores.
10-100 Dependiendo del número de métodos correctamente implementados.
10 El programa no compila.
1 El programa es un plagio total o parcial.