Collection클래스는 여러 유용한 알고리즘을 구현한 메소드들을 제공한다.

1. 정렬(Sorting)

2. 섞기(Shuffling)

3. 탐색(Searching)


|정렬

Collection 클래스의 정렬은 속도가 비교적 빠르고 안정성이 보장되는 합병 정렬을 이용한다.

Collection 클래스의 sort( ) 메소드는 List 인터페이스를 구현하는 컬렉션에 대하여 정렬을 수행한다.

ex)

List<String> list = new LinkedList<String>( );

list.add("김철수");

list.add("김영희");

Collections.sort(list);


<정렬 예제1>

 

출력결과

->정렬 알고리즘을 실행하기 위하여 asList( ) 메소드를 이용하여 배열을 리스트로 변환

->sort( )를 호출하여 정렬한다.


<정렬 예제2>

 

출력결과


|섞기

정렬의 반대 동작을 한다. 즉 원소들의 순서를 랜덤하게 만든다. 게임을 구현할 때 유용하다.(카드 게임에서 카드를 랜덤하게 섞을 때 사용

<섞기 예제>

 

출력결과



|탐색

리스트 안에서 원하는 원소를 찾는 것.

<탐색 예제>

 

출력결과



'Programming Language > Java' 카테고리의 다른 글

6. 입출력-바이트스트림  (0) 2016.06.08
5. 스레드  (0) 2016.06.08
4. 예외처리  (0) 2016.06.08
2. 컬렉션  (0) 2016.06.07
1. 제네릭  (0) 2016.06.07

컬렉션이란?

자바에서 자료 구조를 구현한 클래스들을 칭하는 용어.( 리스트, 스택, 큐, 집합, 해쉬 테이블)


|컬렉션의 종류

자바는 컬렉션 인터페이스와 컬렉션 클래스로 나누어서 제공.


인터페이스

1. Collection : 모든 자료 구조의 부모 인터페이스로서 객체의 모임을 나타낸다.

2. Set : 집합을 나타내는 자료 구조

3. List : 순서가 있는 자료 구조로 중복된 원소를 가질 수 있다.

4. Map : 키와 값들이 연관되어 있는 사전과 같은 자료 구조

5. Queue : 극장에서의 대기줄과 같이 들어온 순서대로 나가는 자료구조


ArrayList

|List 인터페이스

리스트는 순서를 가지는 원소들의 모임으로 중복된 원소를 가질 수 있다.

ArrayList, Vector : List를 배열로 구현한 것

LinkedList : List를 연결 리스트로 구현한 것


|ArrayList

사용 이유 : 배열의 문제점은 배열을 생성할 때 배열의 크기가 고정된다는 점, 반면 ArrayList는 자동적으로 크기가 변경.


#기본생성    ex) ArrayList<String> list = new ArrayList<String>( );

#데이터 저장    ex) list.add("milk");

#인데스 위치에 저장    ex) list.add( 1, "APPLE");

#특정한 위치에 있는 원소 바꿈    ex) list.set( 2, "GRAPE");

#데이터를  삭제     ex) list.remove( 3 );

#인덱스 위치의 값 가져옴    ex) String s = list.get( 1 );

#현재 저장된 원소의 개수    ex) list.size( );

#특정한 데이터가 저장된 위치    ex) int index = list.indexOf("APPLE");


|반복자 사용하기

#hasNext( ) : 아직 방문하지 않은 원소가 있으면 true를 반환

#next( ) : 다음 원소를 반환

#remove( ) : 최근에 반환된 원소를 삭제


반복자를 사용하기 위해서는 먼저 ArrayList의 iterator( ) 메소드를 호출하여서 반복자 객체를 얻는다.

ex)    Iterator e = list.iterator( );


LinkedList

사용 이유 : ArrayList의 경우 중간에서 데이터의 삽입이나 삭제가 발생하는 경우 원소를 이동시켜야 한다. 따러서 연결 리스트로 구현된LinkedList가 사용됨

메소드는 ArrayList와 동일 


|배열을 리스트로 변경하기

List<String> list = Arrays.asList(new String[size]);



SET

 집합은 순서가 없고 중복을 허용하지 않음.

 가장 잘 알려진 방법이 해쉬 테이블

 해쉬 테이블 : 각각의 원소에 대하여 해쉬 코드란 정수를 계산한다. 만약 클래스 작성자라면 반드시 hashCode( )도 구현해야됨

HashSet : 해쉬 테이블에 원소를 저장

TreeSet : 레드 - 블랙 트리에 원소를 저장

LinkedHashSet : 해쉬 테이블과 연결 리스트를 결합


<HashSet 예제>

 

출력결과 


<집합을 이용한 중복된 단어 검출>

 

출력결과


|대량 연산 메소드

s1.containsAll(s2) :  만약 s2가 s1의 부분 집합이면 참

s1.addAll(s2) : s1을 s1과 s2의 합집합

s1.retainAll(s2) : s1을 s1과 s2의 교집합

s1.removeAll(s2) : s1을 s1과 s2의 차집합


집합 연산을 할 때 중요한 점은 원집합이 파괴되면 안되다는 것이다. 따라서 집합 연산을 수행하기 전에 복사본을 만들어야 한다.

<집합 연산을 이용한 예제>

 

출력결과


Queue

: 후단에서 원소를 추가하고 전단에서 원소를 삭제한다. Queue 인터페이스는 LinkedList 클래스와 PriorityQueue 클래스로 구현

: 디큐(deque)는 전단과 후단에서 모두 원소를 추가하거나 삭제할 수 있다. deque 인터페이스는 ArrayDeque와 LinkedList 클래스들로 구현


|Queue 인터페이스

public interface Queue<E> extends Collection<E>{

E element( ); // 처음에 있는 원소 가져옴(삭제하지않음) 

boolean offer(E e);

E peek( ); // 처음에 있는 원소 가져옴(삭제하지않음)

E poll( ); // 처음에 있는 원소 가져옴(삭제)

E remove( );  //처음에 있는 원소 가져옴(삭제)

}


<큐에 저장된 정수값을 1초간격으로 출력>

 

->LinkedList클래스로 큐를 생성하고 0~10까지 큐에 저장한다.

->큐가 비었는지 확인하고 비어있지 않다면 뒤에서 부터 하나씩 삭제해서 출력한다.


|우선순위큐

: 원소들이 무작위로 삽입되었더라도 정렬된 상태로 원소들을 추출, 즉 remove()를 호출할 때마다 가장 작은 원소가 추출된다.(ex, 작업스케줄링)

: 히프라고 하는 자료 구조를 내부적으로 사용


<우선순위 큐 예제>

 

출력결과

->PriorityQueue클래스로 큐객체를 생성한후 30, 80, 20을 추가

->우선순위 큐의 원소를 출력

->큐가비어있을때까지 우선순위 큐의 원소를 삭제하면서 출력 이때 가장 작은 원소 순으로 출력


Map

: 많은 데이터 중에서 원하는 데이터를 빠르게 찾을 수 있는 자료구조. 사전관 같은 자료구조이다. 즉 사전처럼 단어가 있고(키) 단어에 대한 설명(값)이있다. Map은 중복된 키를 가질 수 없다. 각 키는 오직 하나의 값에만 매핑될 수 있다.

:HashMap, TreeMap, LinkedHashMap 3가지의 클래스가 제공. 만약 키들을 정렬된 순서로 방문할 필요가 없다면 HashMap.

ex)

Map<String, Student> freshman = new HashMap<String, Student>( ); //생성

Student kim = new Student("구준표");

freshman.put("20090001", kim); // 저장


String s = "20090001";

st = freshman.get(s); // 구준표 반환


<맵을 이용한 학생자료 예제>

 

출력결과

 

->HashMap클래스를 이용해 st라는 맵객체를 만들었다 ( 키 - 문자열, 값 - Student)

->"201113511"라는 키를 가진 정보를 삭제하고 새로 삽입하였다.

->Map에 저장된 데이터를 방문하기 위해 Map.Entry라는 인터페이스를 사용하였고 모든 값을 출력하였다.


<Map 기본적인 연산 예제>

출력결과

 


-> HashMap클래스를 이용해서 Map객체 m생성

-> sample배열에 있는 값을 가져와 m객체의 빈도를 가져온다 빈도가 null이면 1 아니면 1증가시킨다.

-> MAP m의 값 출력


'Programming Language > Java' 카테고리의 다른 글

6. 입출력-바이트스트림  (0) 2016.06.08
5. 스레드  (0) 2016.06.08
4. 예외처리  (0) 2016.06.08
3. Collections클래스  (0) 2016.06.08
1. 제네릭  (0) 2016.06.07

제네릭 프로그래밍(generic programming)이란 ? 

일반적인 코드를 작성하고 이 코드를 다양한 타입의 객체에 대하여 재사용하는 객체 지향 기법.


제네릭 클래스에서는 타입을 변수로 표시한다. 이것을 타입 매개변수라고 하는데 타입 매개 변수는 객체 생성 시에 프로그래머에 의해 결정된다.

ex)

class Store<T>{

private T data;

public void set(T data)

{
    this.data = data;

}

public T get()

{
    return data;

}

}


-> Store<String> store = new Store<String>( ); //문자열을 저장하는 Store객체

-> Store<Integer> store = new Store<Integer>( ); //정수를 저장하는 Store객체


타입 매개 변수의 표기

E - Element

K - Key

N - Number

T - Type

V - Value

'Programming Language > Java' 카테고리의 다른 글

6. 입출력-바이트스트림  (0) 2016.06.08
5. 스레드  (0) 2016.06.08
4. 예외처리  (0) 2016.06.08
3. Collections클래스  (0) 2016.06.08
2. 컬렉션  (0) 2016.06.07

+ Recent posts