(Java) List 실습

DevSeoRex·2022년 5월 30일
0

Java

목록 보기
6/15

오늘 드디어 컬렉션 프레임워크 파트에 들어섰다.

List에 포함된 여러가지 메서드들과 그 사용법에 대해서 배웠는데 그것을 정리해보고자 한다.

가장 먼저 List를 생성하고 각 요소들을 뽑아내어 출력하는 것을 해보았다.

1. List 생성과 출력

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class List1 {
	public static void main(String[] args) {
		String[] strArr = {"자바","파이썬","루비","C","JS","HTML"};
		List<String> list = new ArrayList<>();
		list.addAll(Arrays.asList(strArr)); //strArr의 요소들을 list에 추가	
		list.forEach(x -> System.out.print(x + " ")); //foreach문을 람다식으로 표현(lamda expression)
		System.out.println();
		list.forEach(System.out::print);
	}
}

List를 생성하면서 list.add() 메서드를 이용하여
Arrays.asList() 메서드로 strArr의 요소들을 List
에 먼저 삽입해 주었다.
forEach문을 사용하여 람다식으로 x -> System.out.print(x + " "); 해주면 각 요소들이 띄어쓰기되어 출력되서 보기가 편한데,
forEach(System.out::print)를 이용해서 출력하면
띄어쓰기를 할 수 없어 많이 불편하다.
그냥 이렇게도 출력할 수 있구나 정도로 알고 넘어가야겠다.

2. List 생성시 유의사항

String 타입의 배열을 생성하고, 바로 Arrays.asList()로 String 배열을 삽입하게 되면,
list.add() 메서드와 list.remove() 메서드가 작동하지 않고 예외를 발생시킨다.
list.set() 메서드(수정)는 작동한다.

import java.util.Arrays;
import java.util.List;
public class List2 {
	public static void main(String[] args) {
		String[] strArr = {"자바","파이썬","루비","C","JS","HTML"};
		List<String> list = Arrays.asList(strArr);
		list.add("C++");    // 불가능 -> 예외 발생
		list.remove("자바"); // 불가능 -> 예외 발생
		list.set(0, "Java");
		list.forEach(x -> System.out.print(x + " ")); //foreach문을 람다식으로 표현(lamda expression)
		System.out.println();
		list.forEach(System.out::print);
	}
}

3. List 정렬하기 & Iterator 출력하기

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
public class List3 {
	public static void main(String[] args) {
		String[] strArr = {"자바","파이썬","루비","C","JS","HTML"};
		List<String> list = new ArrayList<>();
		list.addAll(Arrays.asList(strArr));
		//iterator로 list에 있는 요소 출력하기
		Iterator<String> it = list.iterator();
		while(it.hasNext()) {
			System.out.print(it.next() + " ");
		}
		System.out.println();
		//Comparator을 통한 정렬 방법 1
list.sort(Comparator.naturalOrder()); //오름차순 정렬
		for(String s : list) {
			System.out.print(s + " ");
		}
		System.out.println();
list.sort(Comparator.reverseOrder()); //내림차순 정렬
		for(String s : list) {
			System.out.print(s + " ");
		}
		System.out.println();
		//Comparator을 통한 정렬 방법 2
		list.sort(new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				return o1.compareTo(o2); //오름차순
//				return o2.compareTo(o1); //내림차순
			}
		});
		for(String s : list) {
			System.out.print(s + " ");
		}
		System.out.println();
		//Comparator을 통한 정렬 방법 3
		list.sort((o1,o2) -> o1.compareTo(o2)); //오름차순
		list.sort((o1,o2) -> o2.compareTo(o1)); //내림차순
		//Collections를 통한 정렬
		Collections.sort(list); //오름차순
		Collections.reverse(list);//내림차순
		for(String s : list) {
			System.out.print(s + " ");
		}
		Collections.sort(list, Comparator.naturalOrder()); //오름차순
		Collections.sort(list, Comparator.reverseOrder()); //내림차순
	}
}

List를 생성하고, list.iterator() 메서드를 사용하여 Iterator를 생성하고, while문을 통해서 List안에 있는 요소들을 뽑아내어 출력하였다.

정렬의 방법은 정말 다양했는데,
list.sort() 메서드 안에서 Comparator의 메서드인
naturalOrder() -> 오름차순
reverseOrder() -> 내림차순
위의 메서드들을 활용하여 정렬을 하였다.

list.sort()메서드 안에서 new 연산자를 이용해서
Comparator 객체를 생성하고 compare 메서드를 오버라이딩하여 return값을 o1,o2의 순서를 변경하는 방식으로 오름차순/내림차순으로 정렬하는 방법도 사용해 보았다.

또 list.sort((o1,o2) -> o1.compareTo(o2));
와 같이 람다식으로 축약하여 표현도 가능했다.

Collections.sort(list); //오름차순
Collections.reverse(list); //내림차순

Collections를 이용한 정렬도 가능했다.

또 Collections.sort() 메서드 안에
Comparator의 메서드인 naturalOrder()과 reverseOrder()를 인자값으로 주어, 오름차순과 내림차순으로 정렬할 수도 있었다.

4. List 안의 요소에서 포함여부 확인하기

> import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class List4 {
	public static void main(String[] args) {
		String[] strArr = {"자바","파이썬","루비","C","JS","HTML"};
		List<String> list = new ArrayList<>();
		list.addAll(Arrays.asList(strArr));
		
		//contains 포함 여부 확인하기
		System.out.println(list.contains("자바"));		System.out.println(list.contains("Java"));
		
		//contains all으로 다중 요소 포함여부 확인하기		System.out.println(list.containsAll(Arrays.asList("자바","파이썬")));		System.out.println(list.containsAll(Arrays.asList("자바","Python")));		
		//retain all로 중복요소도 함께 출력하기(교집합)
		list.add("HTML"); //HTML을 2개로 만들어준다.		System.out.println(list.retainAll(Arrays.asList("자바","HTML"))); //적용이후 출력시 공통(교집합) 요소만 출력
		list.forEach(x -> System.out.print(x + " "));
		
	}
}

list.contains() 메서드를 사용하면 해당 값이 List안에 존재하는지를 확인하고 boolean type의 값을 return 해준다. 있으면 true 없으면 false를 리턴한다.

containsAll() 메서드는 여러개의 다중 값을 주게되면, 해당 값들이 모두 List에 포함되어 있을 경우에만 true를 반환하고 하나라도 다른 값이 있을경우 false를 return한다.

list.retainAll() 메서드는 Arrays.asList로 여러 값을 전달하면 해당 값들을 포함하는 값을 추려준다.

forEach문으로 출력하면 retainAll() 메서드에 넣었던 여러 값들과 교집합을 이루는 값만 출력되는 것을 볼 수 있다(중복도 출력)

5. List를 배열로 만들기 & List 섞기

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class List5 {
	public static void main(String[] args) {
		String[] strArr = {"자바","파이썬","루비","C","JS","HTML"};
		List<String> list = new ArrayList<>();
		list.addAll(Arrays.asList(strArr));	
		//subList() 메서드로 리스트의 일부 뽑아오기, 0~3 인덱스의 요소를 뽑는 것 같지만 마지막 요소(3번 인덱스)는 미포함이므로 주의!
		List<String> list2 = new ArrayList<>();
		list2.addAll(list.subList(0, 3));
		for(String s : list2) {
			System.out.print(s + " ");
		}
		System.out.println();		
		//리스트를 배열로 만들기
		String[] strArr2 = new String[list2.size()];
		strArr2 = list2.toArray(strArr2);		
		for(String s : strArr2) {
			System.out.print(s + " ");
		}		
		//리스트 섞기
		for(int i=0; i<3; i++) {
			Collections.shuffle(list);
			list.forEach(x -> System.out.print(x + " "));
			System.out.println();
		}
	}
}

list를 생성하고 list2를 생성한 뒤에 list2에는
subList()를 이용해서 list의 0~2 인덱스까지의 요소들을 저장한다.
subList()의 두번째 인자값(마지막 인덱스)는 해당 인덱스를 포함하지 않고 바로 전의 인덱스 까지 복사하므로, exclusive 조건이다.

이렇게 뽑아온 list2를 strArr2 String 배열에 저장하고 저장이 잘 되었는지 값을 뽑아내 보았고,
잘 동작하였다.

마지막으로 Collections.shuffle(list) 메서드를 이용하여 2번 list를 섞고 한번 섞을 때마다 모든 요소가 출력되게 foreach문으로 뽑아내보았다.
shuffle() 메서드는 순서에 관계없이 랜덤하게 List를 섞어주기 때문에 실행시마다 결과가 바뀐다.

List 하나로만 이렇게 많은 메서드들이 있고 사용법을 익혀야 할 것들이 많은 것 같다.

앞으로 더 노력해야겠다 화이팅 !

0개의 댓글