[자료구조]List : 리스트

김피자·2023년 2월 10일
0

자료구조

목록 보기
1/4
post-thumbnail

List 생성하기

고정 값 List 생성

List<Integer> list = Arrays.asList(1, 2, 3, 4);

Array로 List 생성

Integer[] arr = new Integer[]{1, 2, 3, 4};
List<Integer> list = Arrays.asList(arr);

⚾️ Array(배열)와 List의 데이터 타입이 같아야한다.

잘못된 경우 :

int[] arr = new int[]{1, 2, 3, 4};
List<Integer> list = Arrays.asList(arr);

List로 동일 List 생성

List<Integer> list_1 = Arrays.asList(1, 2, 3, 4);
List<Integer> list_2 = new LinkedList<>(list_1);

Fixed-size List 생성

Arrays.asList를 사용하면 배열처럼 고정된 크기의 리스트 생성이 가능함
이 리스트는 값 변경은 가능하지만, 크기에 영향을 주는 삭제추가는 불가능

List<Integer> list = Arrays.asList(1, 2, 3, 4);
list.set(0, 6); //(시작 인덱스, 설정 값)
list.add(6); // 모태요
list.remove(0); // 이것도 못해요

List를 Array로 바꾸기

코테 문제를 풀다보면

int [] solution = {}; 

이렇게 Array를 반환으로 요구하는 경우가 많은데
풀이 과정에서 List를 사용했다면 반환을 위해 이를 array로 바꿔야 함

Array에 List값 복사해 바꾸기

List<Integer> list = Arrays.asList(1, 2, 3, 4);
int[] arr = new int[list.size()];
for(int i = 0; i < list.size(); i++){
	arr[i] = list.get(i);
}

toArray로 바꾸기

List<String> list = Arrays.asList("A", "B", "c");
String[] str = list.toArray(String[]::new)
List<Integer> list = Arrays.asList(1, 2, 3, 4);
Integer[] arr = list.toArray(Integer[]::new);

toArray 역시 타입이 서로 같아야 사용할 수 있음

stream으로 바꾸기

List<String> list = Arrays.asList("A", "B", "C");
String[] arr = list.stream().toArray(String[]::new);
List<Integer> list = Arrays.asList(1,2,3,4,5);
        int[]arr = list.stream().mapToInt(Integer::intValue).toArray();

List 요소 삭제하기

리스트 요소를 반복문을 통해 삭제할 경우 발생하는 일

for문을 list의 size만큼 수행하며 인덱스 안의 값을 하나 하나 지워보자!

List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
for(int i = 0; i<list.size(); i++){
	list.remove(i)
}

하지만, 이 코드를 수행 후 결과를 출력하면
[2, 4]가 출력된다!!
그 이유는 list안의 요소가 반복문을 통해 지워지면서 list.size()값이 계속 바껴서임!

반복문이 처음 실행될 때에는 0을 인덱스로 하는 요소를 제대로 삭제하지만, 삭제할 때마다 list의 size가 줄어들어 값의 인덱스가 고정되지 않아 제대로 동작 X

그럼 항상 인덱스 0번째 값을 삭제하면 되는거 아닌가요?

List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
for(int i = 0; i<list.size(); i++){
	list.remove(0);
}

이렇게 해도 i가 증가하며 size도 감소하기 때문에 제대로 동작 X

해결 방법 : 새 변수에 size값을 고정해두자

List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
int size = list.size();

for(int i = 0; i<size; i++){
	list.remove(0);
}

Immutable List

리스트를 함수로 전달할 때 call by reference로 전달하게 되는데 이 경우, final로 선언한다 해도 리스트 내용을 변경할 수 있음

void main(){
	List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
    updateList(list);
    System.out.println(list); // [2, 4, 6, 8, 10] 출력
}

void updateList(final list<Integer> list){
	for(int i = 0; i<list.size(); i++){
    	list.set(i, list.get(i) * 2);
    }
}

list를 final로 선언해 updateList에 전달했는데도 값이 변경됐다!!!

이런 현상을 방지하기위해서는 원본 리스트가 훼손되지 않도록하는 리스트 형태로 만들어야함!!!

void main(){
	List<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
    updateList(Collections.unmodifiableList(list));
    System.out.println(list); 
}

void updateList(final list<Integer> list){
	for(int i = 0; i<list.size(); i++){
    	list.set(i, list.get(i) * 2); // Error!!! 발생
    }
}

Collections.unmodifiableList()를 사용하면 리스트 내용을 변경하지 못하게 만들 수 있음!

끄ㅡㅅ!

profile
제로부터시작하는코딩생활

0개의 댓글