Acorn academy 12/12 Collection 인터페이스 2 (List와 Map)

Bae Seong Jun·2023년 12월 12일

Acorn academy

목록 보기
17/70

HashSet, ArrayList, HashMap 각각 순회하는 방법 익히기

HashSet : foreach, Iterator
ArrayList : 일반for, foreach, Iterator
HashMap : .keySet()으로 key값을 가진 HashSet반환후 key를 순회하며 value를 순회

ArrayList

.add()를 이용한 값 추가

Arrays.asList() 메소드를 이용하여 생성 및 값 추가
List<String> list2=Arrays.asList("홍길동", "이순신", "세종", "test", "세종");

ArrayList를 for문, foreach문, Iterator를 이용하여 각각 순회해보기

  • index를 이용할 수 있으므로 for문 순회도 가능하다,.

상위 인터페이스인 List타입으로 다형성을 적용해서 생성해보기

List에서 사용할 수 있는 다양한 메소드들 사용해보기 (indexof, contains, size, isEmpty, remove, set, add, Iterator 등등)

  • 의문점 foreach 사용시 값이 뽑아지는 원리?
    iterable 한 것들만 foreach로 순회가 가능하다.

  • 의문점 asList 는 add,set,remove등이 안된다. 이유 ?
    Arrays.asList 는 set, get, contains 메서드를 갖고있지만 값을 변경하는 메서드는 갖고있지 않다.

아래는 asList사용 코드다.


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ListTest4 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("홍길동");
		list.add("이순신");
		list.add("세종");
		
		List<String> list2=
				Arrays.asList("홍길동", "이순신", "세종", "test", "세종");
		
		System.out.println(list2);
		System.out.println(list2);
//		list2.add("세종");
		System.out.println(list2);
	}
}

Comparator 인터페이스를 이용한 ArrayList 정렬

import java.util.Comparator;

public class PersonAgeSortComparator implements Comparator<Person>{

	@Override
	public int compare(Person o1, Person o2) {
		
		int num = -1;
		if(o1.getAge() > o2.getAge()) {
			num = 0;
		}
		return num;
	}
	
}

정렬 사용

Collections클래스에 sort() 메서드 사용하여 정렬 (Collection 인터페이스가 아님)
위에서 만든 PersonAgeSortComparator를 임플먼트하여 사용

  • 의문점 sort()에 comparator 적용하는 작동방식?

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

public class ListTest5 {
	public static void main(String[] args) {
		List<Integer> set = new ArrayList<>();
		set.add(9);
		set.add(6);
		set.add(1);
		set.add(3);
		set.add(4);
		
		System.out.println("정렬전: " + set);
		Collections.sort(set);
		System.out.println("정렬후: " + set);
		
		System.out.println("정렬전: " + set);
		Collections.reverse(set);
		System.out.println("정렬후: " + set);
		
		System.out.println();
		ArrayList<Person> set2 = new ArrayList<Person>();
		set2.add(new Person("홍길동", 20, "서울"));
		set2.add(new Person("이순신", 44, "전라"));
		set2.add(new Person("강감찬", 33, "전라"));
		System.out.println("정렬전: " + set2);
		
		Collections.sort(set2, new PersonAgeSortComparator());
		System.out.println("정렬후: " + set2);
	}
}

Map 계열의 데이터 처리

key/value 쌍으로 저장하는 자료구조
key로 원하는 값 얻을 수 있다.
key값은 유일한 값
value는 중복이 가능
순서가 없기 때문에 랜덤하게 출력
key 중복시 마지막으로 저장한 key로 덮어쓰기한다.
다른 어떤 자료구조보다 빠른 검색이 가능.
제네릭 사용도 가능 (키와 벨류에 2가지에 사용)
HashMap은 저장되는 순서가 유지되지 않고 단 하나의 null키를 가질 수 있다.
Hashtable은 null키와 값을 가질 수 없다

  • 의문점 : Hashtable은 저장되는 순서가 유지되는건가?

없는 키 값을 get()메서드로 호출할 시 null값을 반환

  • HashMap
  • Hashtable

두개는 비슷하나 HashMap를 주로 쓸 것임
차이는 NULL을 허용하는지 안하는지 (HashMap이 허용)

Interface Map<K,V>
K - keys
V - values

< 메서드 >
put(Object key, Object value)
putAll(Map m) key에 해당되는 value객체를 저장
V get(key) key에 해당되는 value 반환
remove(key) key에 해당되는 value 삭제
void clear() Map의 모든 객체를 삭제
boolean isEmpty() Map이 비어있는지 확인
int size() Map에 저장된 객체의 갯수
Set keySet() Map에 저장된 모든 key객체를 Set 계열로 반환
Collection<V> values() Map에 저장된 모든 값들을 Collection으로 반환
boolean containsKey(key) Map에 지정된 key가 있는지 boolean 반환
boolean containsValue(value) Map에 지정된 value가 있는지 boolean 반환

HashMap

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class MapTest2 {
	
	public static void main(String[] args) {
		HashMap<String,String> map = new HashMap<>();
		// key:String, value:String : String + null 저장 가능
		map.put("one", "홍길동");
		map.put("two", "이순신");
		map.put("three", "이순신");
		map.put("one", "강감찬");
		map.put("one", null);
		map.put(null, "123");
		
		
		
		System.out.println(map.get("one"));
		System.out.println(map.get("two"));
		System.out.println(map.get("three"));
		System.out.println(map.get(null));
		
		System.out.println(map.get("four"));
	}
}

Hashtable

import java.util.Date;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

public class MapTest3 {
	
	public static void main(String[] args) {
		Map<String,String> map = new Hashtable<>();
		// key:String, value:String : String + null 저장 가능
		map.put("one", "홍길동");
		map.put("two", "이순신");
		map.put("three", "이순신");
		map.put("one", "강감찬");
//		map.put("one", null);
//		map.put(null, "123");
		
		
		
		System.out.println(map.get("one"));
		System.out.println(map.get("two"));
		System.out.println(map.get("three"));
//		System.out.println(map.get(null));
		
		System.out.println(map.get("four"));
	}
}

Math.random() : 0.0 ~ 1에 무한히 가까운 수를 반환

Java.util.Random() : 객체 생성후 사용. 변수명.nextInt() 등으로 사용
최소값~ 최대값에 해당하는 정수형 난수를 반환받고싶다면
변수명.nextInt(최대값-1 -최소값) + 최소값
예를들어 만약 10~19의 정수를 뽑고 싶다면

Random random = new Random();
list.add(random.nextInt(10)+10);

순회 HashMap

1) 키값 전체 리턴

Set<String> keys = map.keySet():Set<String>
  //keys set {two, one, three}

2-1) 키값 전체 순회 -> get호출

for(Strig key : keys){
	System.out.println(key + "\t" + map.get(key)
}

2-2) 키값을 순회할 수 있는 Iterator 이용
Iterator<String> ite = keys.iterator();

< Map의 키 값 얻는 법 >
map객체.keySet()

< Map의 키 값으로 value값 얻는 법 >
map객체.get(키값)

< Map의 순회법 >
1) 키값들을 가져온다 HashMap변수.keySet(); ->HashMap객체의 key들을 Set타입으로 반환
2) 그렇게 가져온 Set타입을 Iterator나 foreach로 순회

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MapTest5 {
	public static void main(String[] args) {
		Map<String, Person> map = new HashMap<>();
		map.put("one", new Person("홍길동", 20, "서울"));
		map.put("two", new Person("이순신", 30, "전라"));
		map.put("three", new Person("유관순", 40, "전라"));
		
		//홍길동의 이름, 나이만 출력
		Person p = map.get("one");
		System.out.println(p.getName() + "\t" + p.getAge());
		
		System.out.println();
		System.out.println(map.get("one").getName());
		
		//전체 순회 이름 나이를 출력
		System.out.println("======Map 순회");
		System.out.println("===========foreach");
		Set<String> keys = map.keySet();
		for (String key : keys) {
			Person p2 = map.get(key);
			System.out.println(p2.getName() +  "\t" + p2.getAge());
		}
		
		System.out.println("=============Iterator");
		Set<String> keys2 = map.keySet();
		Iterator<String> ite = keys2.iterator();
		while (ite.hasNext()) {
			String key = ite.next();
			Person p2 = map.get(key);
			System.out.println(p2.getName() + "\t" + p2.getAge());
			
		}
	}
}

Person 객체를 값으로 가진 ArrayList들을 value로 가진 HashMap

  • 구조 파악 (그림 그릴 수 있어야함)
  • 전체 순회
import java.util.ArrayList;
import java.util.HashMap;

public class MapTest6 {
	public static void main(String[] args) {
		ArrayList<Person> list = new ArrayList<Person>();
		list.add(new Person("홍길동", 20, "서울"));
        list.add(new Person("홍길동2", 30, "서울2"));
        list.add(new Person("홍길동3", 40, "서울3"));
        
        ArrayList<Person> list2 = new ArrayList<Person>();
        list2.add(new Person("이순신", 20, "전라"));
        list2.add(new Person("이순신2", 30, "전라2"));
        list2.add(new Person("이순신3", 40, "전라3"));
        
        HashMap<String, ArrayList<Person>> map = new HashMap<>();
        map.put("one", list);
        map.put("two", list2);
        
        for (String key : map.keySet()) {
        	ArrayList<Person> xxx= map.get(key);
			for (Person p : xxx) {
				System.out.println(p.getName() + "\t" + p.getAge() +"\t" + p.getAddress());
			}
			System.out.println();
		}
	}
}

Person을 가진 Map을 가진 ArrayList도 순회 출력 해보기

import java.util.ArrayList;
import java.util.HashMap;

public class MapTest7 {
	public static void main(String[] args) {
		HashMap<String, Person> map = new HashMap<String, Person>();
		map.put("one", new Person("홍길동1", 20, "서울"));
		map.put("two", new Person("이순신1", 30, "전라"));
		map.put("three", new Person("유관순1", 40, "서울"));
		
		HashMap<String, Person> map2 = new HashMap<String, Person>();
		map2.put("one", new Person("홍길동2", 200, "서울2"));
		map2.put("two", new Person("이순신2", 300, "전라2"));
		map2.put("three", new Person("유관순2", 400, "서울2"));
		
		ArrayList<HashMap<String, Person>> list = new ArrayList<HashMap<String,Person>>();
		list.add(map);
		list.add(map2);
		
		
		for (HashMap<String, Person> hashMap : list) {
			for (String s : hashMap.keySet()) {
				System.out.println(hashMap.get(s).getName()+ "\t");
			}
			System.out.println();
		}
	}
}

Properties

Hashtable의 하위 클래스인 Properties 클래스는 key와 value 모두 String로 저장할 때 사
용하는 특화된 클래스이다. setProperty(String key, String value) 메서드로 저장하고 getProperty(String key) 메서
드로 value값을 얻는다. 시스템의 환경변수 값을 자바에서는 Properties 로 참조해서 출력
할 수 있다.

객체 생성
Properties prop = new Properties();

값 추가
prop.setProperty("one", "홍길동");

값 얻기
prop.getProperty("two")

키값 얻기
Set<String> keys = props.stringPropertyNames();

Properties 선언 및 사용

import java.util.Properties;

public class MapTest8 {
	public static void main(String[] args) {
		
		Properties prop = new Properties();
		prop.setProperty("one", "홍길동");
		prop.setProperty("two", "홍길동2");
		prop.setProperty("three", "홍길동3");
		prop.setProperty("three", null);
		
		String one = prop.getProperty("one");
		System.out.println(one);
		System.out.println(prop.getProperty("two"));
		System.out.println(prop.getProperty("three"));
		
	}
}

'시스템 환경변수' 키와 벨류를 가져와서 키를 얻어 순회하여 보기

import java.util.Properties;
import java.util.Set;

public class MapTest9 {
	public static void main(String[] args) {
		
		Properties props = System.getProperties();
		
		Set<String> keys = props.stringPropertyNames();
		for (String key : keys) {
			System.out.println(props.get(key));
		}

	}
}

< 메서드 >

Enumeration 메서드 Iterator 메서드 설명

boolean
hasMoreElements() boolean hasNext() 컬렉션에 데이터가 있는지 검사. 있으면 true 없 으면 false 리턴

Object nextElement() Object next() 컬렉션의 데이터를 리턴. 없음 void remove() 컬렉션의 데이터를 삭제.

Enumeration 은 Java 1.0에서 사용되었으며 Iterator는 Enumeration을 대체할 목적으로
Java 1.2 버전부터 추가되었다.
전체 키값만 저장
Enumeration<?> enu = props.propertyNames();

public class MapTest9 {
	public static void main(String[] args) {
		
		Properties props = System.getProperties();
		
		Set<String> keys = props.stringPropertyNames();
		for (String key : keys) {
			System.out.println(props.get(key));
		}
		
		System.out.println("===========");
		Enumeration<?> enu = props.propertyNames();
		while (enu.hasMoreElements()) {
			Object obj = enu.nextElement();
			String key = (String)obj;
			String value = props.getProperty(key);
			System.out.println("enu를 이용한 출력 " + key + " = " + value);
			 
		}
	}
}
profile
코딩 프로?

0개의 댓글