1. List의 특징
- 선형적인 자료구조
- 데이터를 일렬로 늘여 놓은 형태
- 순서
- 데이터 삽입하기
- 데이터 삭제하기
- 리스트 탐색하기
2. List의 종류
- ArrayList
- LinkedList : Single Linked List, Double Linked List
3. ArrayList
- 배열 기반의 리스트
- 메모리 공간을 연속적으로 사용
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
// 문자열 리스트 생성
List<String> list = new ArrayList<>();
// 리스트에 문자열 넣기
list.add("Hello");
list.add("World");
list.add("GRACE");
System.out.println(list);
// 리스트에서 문자열 삭제
list.remove("Hello");
System.out.println(list);
// 리스트에서 원하는 문자열 찾기 (0번째 데이터)
System.out.println(list.get(0));
}
}
4. ArrayList 배열 예제
1. IList라는 이름의 인터페이스를 생성
package list;
public interface IList<T> {
void add(T t);
void insert(int index, T t);
void clear();
boolean delete(T t);
boolean deleteByIndex(int index);
T get(int index);
int indexOf(T t);
boolean isEmpty();
boolean contains(T t);
int size();
}
2. 인터페이스를 생성 후 구현해줄 클래스를 생성 후 초기 설정 및 생성자 생성
package list;
public class MyArrayList<T> implements IList<T> {
private static final int DEFAULT_SIZE = 50;
private int size;
private T[] elements;
// 생성자 생성
public MyArrayList() {
this.size = 0;
this.elements = (T[]) new Object[DEFAULT_SIZE];
}
3. 배열 끝에 데이터를 넣어주는 add 함수 예제
@Override
public void add(T t) {
// 만약에 elements 배열에 데이터가 꽉 찼을 경우
// Arrays.copyOf를 사용하여 배열의 크기를 확장시킨 후 데이터를 옮겨준다
// 옮기지 않을경우 그냥 새 배열을 생성한것과 다름없음
if(this.size == this.elements.length) {
this.elements = Arrays.copyOf(this.elements, this.size * 2);
}
this.elements[this.size++] = t;
}
4. 배열의 원하는 부분에 데이터를 넣어주는 insert함수 예제
@Override
public void insert(int index, T t) {
if(this.size == this.elements.length) {
this.elements = Arrays.copyOf(this.elements, this.size * 2);
}
for (int i = index; i < this.size; i++) {
this.elements[i + 1] = this.elements[i];
}
this.elements[index] = t;
this.size++;
}
5. 배열의 삭제하고 싶은 데이터(원하는 값)을 삭제하는 delets함수 예제
@Override
public boolean delete(T t) {
for(int i = 0; i < this.size; i++) {
if(this.elements[i].equals(t)) {
for(int j = i; j < this.size - 1; j++) {
this.elements[j] = this.elements[j + 1];
}
this.size--;
return true;
}
}
return false;
}
6. 배열의 위치에 해당하는 데이터를 삭제하는 deleteByIndex함수 예제
@Override
public boolean deleteByIndex(int index) {
if(index < 0 || index > this.size - 1 ) {
return false;
}
for(int i = index; i< this.size -1; i++) {
this.elements[i] = this.elements[i + 1];
}
this.size--;
return true;
}
7. 배열의 원하는 데이터를 가져오는 get함수 예제
@Override
public T get(int index) {
if(index < 0 || index > this.size - 1) {
throw new IndexOutOfBoundsException();
}
return this.elements[index];
}
8. 파라미터 t로 받은 데이터가 배열에 존재하면 true 그렇지 않다면 false를 반환하는 contains함수 예제
@Override
public boolean contains(T t) {
for(int i = 0; i < this.size; i++) {
if(this.elements[i].equals(t)) {
return true;
}
}
return false;
}
9. contains함수와 유사하지만 데이터의 유무만 파악해주는게 아닌 존재한다면 어느 위치에 존재하는지 알려주는 indexOf함수 예제
@Override
public int indexOf(T t) {
for(int i = 0; i < this.size; i++) {
if(this.elements[i].equals(t)) {
return i;
}
}
return -1;
}
10. 배열에 데이터가 얼마나 있는지 조회해주는 size함수 예제
@Override
public int size() {
return this.size;
}
11. 배열에 데이터가 있는지 없는지 확인하는 isEmpty함수 예제
@Override
public boolean isEmpty() {
return this.size == 0;
}
12. 배열에 데이터를 전부 비워주는 clear함수 예제
@Override
public void clear() {
this.size = 0;
this.elements = (T[]) new Object[DEFAULT_SIZE];
}
'자료구조와 알고리즘 > 리스트' 카테고리의 다른 글
[자료구조] 리스트 - DoubleLinkedList (0) | 2024.12.18 |
---|---|
[자료구조] 리스트 - LinkedList (10) | 2024.12.17 |