JAVA_Collection

이혜윤·2024년 2월 7일

JAVA

목록 보기
4/9

JAVA_Collection

1. collection framework

1.1 정의

객체들을 한 곳에 모아 놓고 편리하게 사용할 수 있는 환경을 제공

정적 자료구조 (static)

  • 고정된 크기의 자료 구조
  • 배열이 대표적인 정적 자료 구조
  • 선언 시 크기를 명시하면 바꿀 수 없음

동적 자료구조 (dynamic)

  • 요소의 개수에 따라 자료구조의 크기가 동적으로 증가하거나 감소
  • 리스트, 스택, 큐 등

1.2 종류

1.2.1 List

  • 순서가 있다.
  • 중복이 허용된다.
  • ArrayList, LinkedList, Vector
List<String> names = new ArrayList<String>();
       
       names.add("현경찬");
       names.add("배태웅");
       names.add("양지웅");
       System.out.println(names);
       
       // 1. index를 이용한 삭제
       names.remove(0);
       System.out.println(names);
       
       // 2. 값을 이용한 삭제
       names.remove("송창용");
       System.out.println(names);
       
       // 3. 전부 삭제
       names.clear();
       System.out.println(names);
       System.out.println(names.isEmpty());
       
       // 4. 중복된 값을 삭제할 시 앞에 꺼만 삭제 됨
       names.add("배태웅");
       names.add("배태웅");
       System.out.println(names);
       names.remove("배태웅");
       System.out.println(names);
       
       // 삭제할 때 주의할 점 : 지우면서 인덱스가 바뀌기 때문에 문제 발생 
       // 삭제 시 리스트 크기도 바뀌고 각 원소들의 index도 바뀜
       // 학생1을 다 삭제하고 싶다.
       names.add("학생1");
       names.add("학생1");
       names.add("학생2");
       System.out.println(names);
       
       // 잘못된 예시
//       for(int i=0; i<names.size(); i++) {
//    	   if(names.get(i).equals("학생1"))
//    		   names.remove(i);
//       }
//       System.out.println(names);
       
       // 올바른 예시
       for(int i=names.size()-1; i>=0; i--) {
    	   if(names.get(i).equals("학생1"))
    		   names.remove(i);
       }
       System.out.println(names);

1.2.2 Set

  • 중복 허용X
  • 순서 보장X
  • HashSet, TreeSet…

Set - HashSet

  • Hashtable , 성능 면에서 우수하다고 알려져있음
Set 에서 중복 판단하는 방법
1. hashCode(); 일치시킨다.
2. equals() 오버라이드.
@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return id.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Person) {
			Person other = (Person) obj;
			return id.equals(other.id);
		}
		
		return false;
	}

1.2.3 Map

Key와 value 를 하나의 Entry로 묶어서 데이터 관리, 순서는 없으며 키에 대한 중복은 없음

빠른 속도

  • 구현 클래스 - HashMap, TreeMap
  • 사전과 같은 자료구조
  • 키로 구별( 중복X), 값(중복 가능)
  • 키가 마치 set처럼 … 순서가 보장되지는 않는다.
Map<String, String> map = new HashMap<>();
        map.put("서울5반", "현경찬");
        map.put("서울6반", "옥진석");
        map.put("서울7반", "육예진");
        map.put("서울8반", "서경덕");
        
        System.out.println(map);
        System.out.println(map.get("서울5반"));
        
        // 똑같은  키에 새로운 값을 넣으면 대체가 됩니다.
        map.put("서울6반", "송예진");
        System.out.println(map); // 대체됨
        
        System.out.println(map.containsKey("서울8반")); // true
        System.out.println(map.containsValue("현경찬")); //true

맵의 순회

	// 맵의 순회
	// 1. keySet()
	for(String key: map.keySet()) {
		System.out.printf("%s: %s \n", key, map.get(key));
	}
	
	// 2. entrySet()
	for(Map.Entry<String, String> entry: map.entrySet()) {
		System.out.println(entry.getKey()+":"+entry.getValue());
	}
	
	// 3.

1.2.4 Queue

  • queue는 인터페이스, 구현체는 LinkedList class를 사용
  • 큐 자료구조: FIFO. 가장 먼저 들어온 값이 가장 먼저 빠져나감
  • boolean offer(E e) : 데이터를 추가
  • E peek(): 가장 앞에 있는 데이터 조회
  • E poll(): 가장 앞에 있는 데이터 빼내기
  • boolean isEmpty() 큐가 비어있는지 여부
  • front ↔ rear
Queue<Integer> queue = new LinkedList<>();
        
queue.offer(10);

// queue 에다가 순차적으로 값 집어넣기
for(int i=0; i<5; i++) {
	queue.offer(i);
}

// queue에서 값을 제거하기 
while(!queue.isEmpty()) {
	System.out.println(queue.poll());
}

1.2.5 Stack

  • Stack 클래스를 사용
  • LIFO. 가장 나중에 들어온 값이 가장 먼저 빠져나감
  • E push(E e) 데이터를 추가
  • E peek() 가장 위에 있는 데이터 조회
  • E pop() 가장 위에 있는 데이터 빼내기
  • boolean isEmpty() 스택이 비어있는지 여부
Stack<Integer> stack = new Stack<>();
	
for(int i=0; i<5; i++) {
	stack.push(i);
}

while(!stack.isEmpty()) {
	System.out.println(stack.pop());
}

2. 정렬

요소들을 특정 기준에 맞추어 오름차순 또는 내림차순으로 배치하는 것

순서를 가지는 collection들만 정렬 가능

collections의 sort()를 이용한 정렬

2.1 Comparable interface

public interface Comparable<T> {
	public int compareTo(T o);
}
  • 양수: 자리 바꿈
  • 음수: 자리 유지
  • 0: 동일 위치

2.2 comparator

객체가 comparable을 구현하고 있지 않거나 사용자 정의 알고리즘으로 정렬하려는 경우

  • String을 알파벳 순이 아니라 글자수 별로 정렬을 하고 싶다.

sort(List list, Comparator<? Super T> c)

public interface Comparator<T>{
	int compare(T o1, T o2);
}

comparator 활용

anonymous inner class

comparator 인터페이스로서는 객체 생성을 못해서 불안정하지만, 밑에 구현을 서술해줌으로써 임시 설계도가 완성됨..

Collections.sort(names, new comaprator<String>(){
	@Override
	public int compare(String o1, String o2){
	return Integer.comapre(o1.length,o2.length);
	}
}

람다 표현식

  • 이름이 없는 함수
  • 파라미터로 전달하기 위한 함수
  • 주로 길이가 짧을 때
  • (매개변수…) → {함수 본문 내용}
    • 매개변수가 없을 때는 빈 괄호
    • 매개변수가 1개일 때는 괄호 생략 가능
    • 본문 내용이 1문장만 있을 때는 중괄호 생략 가능
  • 매개변수의 타입을 생략할 수 있다.
Collections.sort(persons, (Person o1, Person o2)->{
	 if(o1.name.equals(o2.name)) {
	   return o1.age - o2.age;
	 }
	 return o1.name.compareTo(o2.name);
});

참고

legacyMergeSort (Collection.sort(persons))

  1. 만약 person이 comparable을 구현하고 잇다면

person[j-1].compareTo(person[j])

  1. comparator를 넣어서 호출했다면?

c.compare(person[j-1],person[j])

profile
구르미 누나

0개의 댓글