[JAVA] Iterator, HashMap
컬렉션의 순차 검색을 위한 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()