From 5ffd71962a8ab0641c84528d45c3a8f099896b9d Mon Sep 17 00:00:00 2001 From: hellomatia Date: Tue, 28 May 2024 22:45:13 +0900 Subject: [PATCH] =?UTF-8?q?[LinkedList]:=20LinkedList=5Fhellomatia=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LinkedList/LinkedList_hellomatia.java | 102 +++++++++++ .../java/List/LinkedList/LinkedListTest.java | 167 ++++++++++++++++++ .../List/LinkedList/LinkedListTest_name.java | 64 ------- 3 files changed, 269 insertions(+), 64 deletions(-) create mode 100644 src/main/java/List/LinkedList/LinkedList_hellomatia.java create mode 100644 src/test/java/List/LinkedList/LinkedListTest.java delete mode 100644 src/test/java/List/LinkedList/LinkedListTest_name.java diff --git a/src/main/java/List/LinkedList/LinkedList_hellomatia.java b/src/main/java/List/LinkedList/LinkedList_hellomatia.java new file mode 100644 index 0000000..e55c51f --- /dev/null +++ b/src/main/java/List/LinkedList/LinkedList_hellomatia.java @@ -0,0 +1,102 @@ +package List.LinkedList; + +import List.List; + +public class LinkedList_hellomatia implements List { + private final Node head; + private Node tail; + private int size; + + public LinkedList_hellomatia() { + this.head = new Node(null); + this.tail = head; + } + + @Override + public void insert(E data) { + tail.setNext(createNode(data)); + tail = tail.getNext(); + size++; + } + + private Node createNode(E data) { + return new Node(data); + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size() == 0; + } + + @Override + public boolean contains(E o) { + for (Node now = head.getNext(); now != null; now = now.getNext()) { + if (now.getData().equals(o)) { + return true; + } + } + return false; + } + + @Override + public E get(int index) { + checkIndex(index); + return getNode(index).getData(); + } + + @Override + public E remove(int index) { + checkIndex(index); + Node removeNode = getNode(index); + Node prevNode = getNode(index - 1); + if (removeNode == tail) { + prevNode.setNext(null); + tail = prevNode; + } else { + prevNode.setNext(removeNode.getNext()); + } + removeNode.setNext(null); + size--; + return removeNode.getData(); + } + + private void checkIndex(int index) { + if (index < 0 || index >= size()) { + throw new IndexOutOfBoundsException(); + } + } + + private Node getNode(int index) { + Node now = head.getNext(); + for (int i = 0; i < index; i++) { + now = now.getNext(); + } + return now; + } + + private class Node { + private final E data; + private Node next; + + protected Node(E data) { + this.data = data; + } + + private Node getNext() { + return next; + } + + private void setNext(Node next) { + this.next = next; + } + + private E getData() { + return data; + } + } +} diff --git a/src/test/java/List/LinkedList/LinkedListTest.java b/src/test/java/List/LinkedList/LinkedListTest.java new file mode 100644 index 0000000..07de12a --- /dev/null +++ b/src/test/java/List/LinkedList/LinkedListTest.java @@ -0,0 +1,167 @@ +package List.LinkedList; + +import static id.ID.hellomatia; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import List.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class LinkedListTest { + + private final LinkedListFactory factory = new LinkedListFactory<>(); + private List list; + + @BeforeEach + void init() { + list = factory.createList(hellomatia); + } + + @Test + void LinkedList의_생성_및_초기화() { + assertThat(list).isNotNull(); + } + + @Test + void 데이터_5개_저장() { + list.insert(11); + list.insert(11); + list.insert(22); + list.insert(22); + list.insert(33); + + assertThat(list.size()).isEqualTo(5); + assertThat(list.get(0)).isEqualTo(11); + assertThat(list.get(1)).isEqualTo(11); + assertThat(list.get(2)).isEqualTo(22); + assertThat(list.get(3)).isEqualTo(22); + assertThat(list.get(4)).isEqualTo(33); + } + + @Test + void 데이터_5개_저장_후_22인_데이터_모두_삭제() { + list.insert(11); + list.insert(11); + list.insert(22); + list.insert(22); + list.insert(33); + + for (int i = 0; i < list.size(); i++) { + if (list.get(i) == 22) { + list.remove(i); + i--; // 삭제되면 index가 조정되므로 해당 index부터 다시 확인해야 합니다. + } + } + + assertThat(list.size()).isEqualTo(3); + assertThat(list.get(0)).isEqualTo(11); + assertThat(list.get(1)).isEqualTo(11); + assertThat(list.get(2)).isEqualTo(33); + } + + @Test + void 데이터_중복_저장_후_모두_포함여부_확인() { + list.insert(11); + list.insert(11); + list.insert(22); + list.insert(22); + list.insert(33); + + assertThat(list.contains(11)).isTrue(); + assertThat(list.contains(22)).isTrue(); + assertThat(list.contains(33)).isTrue(); + } + + @Test + void 비어있는_리스트_확인() { + assertThat(list.isEmpty()).isTrue(); + list.insert(10); + assertThat(list.isEmpty()).isFalse(); + } + + @Test + void 데이터_삽입_후_크기_확인() { + assertThat(list.size()).isEqualTo(0); + list.insert(10); + assertThat(list.size()).isEqualTo(1); + } + + @Test + void 유효하지_않은_인덱스로_데이터_가져오기() { + assertThatThrownBy(() -> list.get(0)).isInstanceOf(IndexOutOfBoundsException.class); + list.insert(10); + assertThatThrownBy(() -> list.get(-1)).isInstanceOf(IndexOutOfBoundsException.class); + assertThatThrownBy(() -> list.get(2)).isInstanceOf(IndexOutOfBoundsException.class); + } + + @Test + void 유효하지_않은_인덱스로_데이터_삭제() { + assertThatThrownBy(() -> list.remove(0)).isInstanceOf(IndexOutOfBoundsException.class); + list.insert(10); + assertThatThrownBy(() -> list.remove(-1)).isInstanceOf(IndexOutOfBoundsException.class); + assertThatThrownBy(() -> list.remove(2)).isInstanceOf(IndexOutOfBoundsException.class); + } + + @Test + void 모든_데이터_삭제_후_리스트_비우기() { + list.insert(10); + list.insert(20); + list.insert(30); + + list.remove(0); + list.remove(0); + list.remove(0); + + assertThat(list.size()).isEqualTo(0); + assertThat(list.isEmpty()).isTrue(); + } + + @Test + void 데이터_삽입_및_삭제_반복() { + list.insert(10); + list.insert(20); + list.insert(30); + list.insert(40); + + list.remove(1); + list.insert(50); + + assertThat(list.size()).isEqualTo(4); + assertThat(list.get(0)).isEqualTo(10); + assertThat(list.get(1)).isEqualTo(30); + assertThat(list.get(2)).isEqualTo(40); + assertThat(list.get(3)).isEqualTo(50); + } + + @Test + void 리스트의_중간에_데이터_삽입() { + list.insert(10); + list.insert(20); + list.insert(30); + + list.remove(1); + list.insert(25); + + assertThat(list.size()).isEqualTo(3); + assertThat(list.get(0)).isEqualTo(10); + assertThat(list.get(1)).isEqualTo(30); + assertThat(list.get(2)).isEqualTo(25); + } + + @Test + void 데이터_5개_삽입_후_모두_삭제() { + list.insert(10); + list.insert(20); + list.insert(30); + list.insert(40); + list.insert(50); + + for (int i = 0; i < 5; i++) { + list.remove(0); + } + + assertThat(list.size()).isEqualTo(0); + assertThat(list.isEmpty()).isTrue(); + } +} \ No newline at end of file diff --git a/src/test/java/List/LinkedList/LinkedListTest_name.java b/src/test/java/List/LinkedList/LinkedListTest_name.java deleted file mode 100644 index b273837..0000000 --- a/src/test/java/List/LinkedList/LinkedListTest_name.java +++ /dev/null @@ -1,64 +0,0 @@ -package List.LinkedList; - -import static id.ID.name; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - -import List.List; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -public class LinkedListTest_name { - - private final LinkedListFactory factory = new LinkedListFactory<>(); - private List list; - - @BeforeEach - void init() { - //깃허브 아이디 입력하면 각자 만든 리스트 객체 생성 - list = factory.createList(name); - } - - @Test - void LinkedList의_생성_및_초기화() { - assertThat(list).isNotNull(); - } - - @Test - void 데이터_5개_저장() { - list.insert(11); - list.insert(11); - list.insert(22); - list.insert(22); - list.insert(33); - - assertThat(list.size()).isEqualTo(5); - assertThat(list.get(0)).isEqualTo(11); - assertThat(list.get(1)).isEqualTo(11); - assertThat(list.get(2)).isEqualTo(22); - assertThat(list.get(3)).isEqualTo(22); - assertThat(list.get(4)).isEqualTo(33); - } - - - @Test - void 데이터_5개_저장_후_22인_데이터_모두_삭제() { - list.insert(11); - list.insert(11); - list.insert(22); - list.insert(22); - list.insert(33); - - // Iterable을 구현하면 enhanced for loop를 사용할 수 있습니다. - for (int i = 0; i < list.size(); i++) { - if (list.get(i) == 22) { - list.remove(i); - i--; // 삭제되면 index가 조정되므로 해당 index부터 다시 확인해야 합니다. - } - } - - assertThat(list.size()).isEqualTo(3); - assertThat(list.get(0)).isEqualTo(11); - assertThat(list.get(1)).isEqualTo(11); - assertThat(list.get(2)).isEqualTo(33); - } -} \ No newline at end of file