쌓고 쌓다

[JAVA] Iterator, HashMap 본문

프로그래밍/java

[JAVA] Iterator, HashMap

승민아 2022. 6. 5. 19:12

컬렉션의 순차 검색을 위한 Iterator(일방향)

- iterator()

  • 적절한 순서로 컬렉션 요소를 순차 검색하는 Iterator 객체 반환
  • Vector<E>, ArrayList<E>, LinkedList<E>가 상속받는 인터페이스의 메소드이다.
  • 즉, 컬렉션의 iterator() 메소드 호출하면 Iterator 객체를 얻을 수 있다.
    • 해당 컬렉션을 순차 검색할 수 있는 Iterator 객체 리턴
Vector<Integer> v = new Vector<Integer>();
...
Iterator<Integer> it = v.iterator();
while(it.hasNext()) // 모든 요소 방문 
{
int n = it.next(); // 다음 요소 리턴(순차적)
... 
}

모든 요소 방문은 v.size(), v.get() 등으로 구현할 수 있지만 Iterator로 구현도 가능하다.

boolean hasNext() 방문할 요소가 남아 있으면 true 리턴
E next() 다음 요소 리턴
void remove() 마지막으로 리턴된 요소 제거(최근 검색(리턴)된 요소를 제거)

 

(예제) Vector의 모든 요소를 출력하고 합 구하기

public class Test {
	
	public static void main(String[] args) {
		Vector<Integer> v = new Vector<Integer>();
		v.add(5); v.add(4); v.add(100); v.add(-1);
		Iterator<Integer> it = v.iterator();
		while(it.hasNext())
		{
			int n = it.next();
			System.out.println(n);
		}
		
		
	}
}

출력 결과

 

 

위의 예제에 이어서 총합을 구하려고 한다.

import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Set;
import java.util.Vector;

public class Test {
	
	public static void main(String[] args) {
		Vector<Integer> v = new Vector<Integer>();
		v.add(5); v.add(4); v.add(100); v.add(-1);
		Iterator<Integer> it = v.iterator();
		while(it.hasNext())
		{
			int n = it.next();
			System.out.println(n);
		}
		
		int sum =0;
		while(it.hasNext())
		{
			int n = it.next();
			sum+=n;
		}
		System.out.println("총합:"+sum);
			
		
		
	}
}

 

총합이 0으로 나온다... 왜냐하면 iterator를 다시 만들지 않았기 때문이다.

int sum =0;
it=v.iterator();
while(it.hasNext())
{
	int n = it.next();
	sum+=n;
}
	System.out.println("총합:"+sum);

이렇게 다시 while문을 돌기전에 iterator를 다시 만들어줘야 한다. 일방향이기 때문이다.

 

주의 ) 원본 컬렉션이 바뀌면 iterator를 다시 만들어야 한다.

아래의 코드는 에러가 난다 iterator를 만들고 원본 컬렉션이 변경되었기 때문에

while문안에서 예외가 발생한다.

public class Test {
	
	public static void main(String[] args) {
		Vector<Integer> v = new Vector<Integer>();
		v.add(5); v.add(4); v.add(100); v.add(-1);
		Iterator<Integer> it = v.iterator();
		v.add(7777);
		while(it.hasNext())
		{
			int n = it.next();
			System.out.println(n);
		}
			
		
	}
}

 

아래와 같이 iterator를 다시 생성해 해결하자.

public class Test {
	
	public static void main(String[] args) {
		Vector<Integer> v = new Vector<Integer>();
		v.add(5); v.add(4); v.add(100); v.add(-1);
		Iterator<Integer> it = v.iterator();
		v.add(7777);
		it = v.iterator();
		while(it.hasNext())
		{
			int n = it.next();
			System.out.println(n);
		}	
		
	}
}

 

HashMap<K,V> 컬렉션

  • 요소 : 키(key)와 값(value)의 쌍
    • K : 키로 사용할 요소의 타입
    • V : 값으로 사용할 요소의 타입
    • '값'을 검색하기 위해서는 '키'가 필요하다.
    • HashMap에 저장될 위치 인덱스 = Hash 함수에 key를 넣은 것이다.
  • 삽입, 삭제 및 검색이 빠르다.
    • 요소 삽입 : put() 메소드
    • 요소 검색 : get() 메소드
public class Test {
	
	public static void main(String[] args) {
		HashMap<String,String> h = new HashMap<String,String>();
		h.put("apple","사과");
		String kor = h.get("apple");
		System.out.println(kor);
	}
}

 

HashMap<String,String>

Key(영문) Value(한글)
apple 사과
lemon 레몬
orange 오렌지

 

HashMap<String, Score>

Key(응시번호) Value(Score객체)
N001 (응시번호, 이름, 성적배열 등...이 포함된 Score 객체)
E4553 마찬가지

HashMap<String,String>의 내부 구성은 아래 그림과 같음

 

HashMap<K,V>의 주요 메소드

메소드 설명
void clear() 해시맵의 모든 요소 삭제
boolean containsKey(Object key) 지정된 키(key)를 포함하고 있으면 true 리턴
boolean containsValue(Object value) 지정된 값(value)에 일치하는 키가 있으면 true 리턴
V get(Object key) 지정된 키(key)의 값 리턴, 키가 없으면 null이 반환됨
boolean isEmpty() 해시맵이 비어 있으면 true 리턴
Set<K> keySet() 해시맵의 모든 키를 담은 Set<K> 컬렉션 리턴
V put(K key, V value) key와 value 쌍을 해시맵에 저장
V remove(Object key) 지정된 키(key)를 찾아 키와 값 모두 삭제
int size() HashMap에 포함된 요소의 개수 리턴

 

(예제) HashMap에서 삭제

public class Test {
	
	public static void main(String[] args) {
		HashMap<String,String> h = new HashMap<String,String>();
		h.put("apple", "사과");
		h.put("love", "사랑");
		h.put("baby", "아기");
		System.out.println(h.size());
		h.remove("baby");
		System.out.println(h.size());
	}
}

 

(예제)HsahMap을 이용하여 (영어, 한글) 단어 쌍의 저장

-> HashMap에 키로 검색을 했더니 없다면 null이 반환되어 나온다는 것을 기억하자.

public class Test {
	
	public static void main(String[] args) {
		HashMap<String,String> dic = new HashMap<String,String>();
		dic.put("apple", "사과");
		dic.put("love", "사랑");
		dic.put("baby", "아기");
		Scanner scanner = new Scanner(System.in);
		while(true)
		{
			System.out.print("찾고 싶은 단어:");
			String eng = scanner.next();
			if(eng.equals("exit"))
			{
				System.out.println("종료합니다.");
				break;
			}
			
			String kor = dic.get(eng);
			if(kor==null)
				System.out.println("없는 단어.");
			else
				System.out.println(kor);

		}
	}
}

 

 

(예제) HashMap을 이용하여 학생 이름과 점수 관리

public class Test {
	
	public static void main(String[] args) {
		HashMap<String,Integer> scoreMap = new HashMap<String,Integer>();
		scoreMap.put("가",10); scoreMap.put("나",20);
		scoreMap.put("다", 30); scoreMap.put("라", 40);
		
		System.out.println("HashMap 요소 개수"+scoreMap.size());
		Set<String> keys = scoreMap.keySet(); // key만으로 구성된 집합
		Iterator<String> it = keys.iterator(); // 그 집합(Set)에서 iterator메소드 이용해 Iterator구하기
		
		while(it.hasNext())
		{
			String name = it.next();
			int score = scoreMap.get(name);
			System.out.println(name+" : "+score);
		}
		
	}
}

 

실행 결과

 

(예제) id와 전화번호로 구성되는 Student 클래스를 만들고, 이름을 '키'로하고 Student 객체를 '값'으로 하는 해시 맵

class Student
{
	int id;
	String tel;
	public Student(int id, String tel)
	{
		this.id = id;
		this.tel = tel;
	}
}

public class Test {
	
	public static void main(String[] args) {
		HashMap<String,Student> map = new HashMap<String,Student>();
		map.put("사람1", new Student(1,"010-111-1111"));
		map.put("사람2", new Student(2,"010-222-2222"));
		map.put("사람3", new Student(3,"010-333-3333"));
		
		Scanner scanner = new Scanner(System.in);
		while(true)
		{
			System.out.print("검색할 이름:");
			String name = scanner.next();
			
			if(name.equals("exit"))
				break;
			
			Student student = map.get(name);
			if(student==null)
				System.out.println("존재하지 않는 사람");
			else
				System.out.println("id"+student.id+" tel:"+student.tel);
		}
	}
}

interface Iterable 아래에 interface Collection이 있고

그 아래에 세 갈래로 List, Set, Map이 있다.

이까지는 interface이다.

 

아래는 클래스

List : ArrayLits, Vector, LinkedList

Set : HashSet, TreeSet

Map : HashMap, TreeMap

 

interface Collection의 메소드

  • add()
  • remove()
  • clear()
  • contains()
  • size()
  • toArray()
  • iterator()
Comments