컬렉션 프레임웍
: 데이터 군을 저장하는 클래스들을 표준화한 설계
HashSet
- Set인터페이스를 구련한 가장 대표적인 컬렉션
- Set인터페이스의 특징대로 HashSet은 중복된 요소를 저장하지 않는다(객체를 저장하기 전에 기존에 같은 객체가 있는지 확인함).
- 새로운 요소 추가 => add, addAll 메소드 사용
=> 중복된 요소 추가 시 false반환
package datastructure;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
public class HashSetTest {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("java");
list.add("서블릿");
list.add("js");
list.add("스프링");
list.add("스프링");
int size = list.size();
for(String str : list) { // list만큼 꺼내서 str에 담는다
System.out.println(str);
}
System.out.println();
//집합 - 데이터를 중복해서 저장할 수 없다.
//HashSet생성
HashSet<String> set = new HashSet<String>();
//set에 데이터 넣기
set.add("java");
set.add("서블릿");
set.add("js");
set.add("스프링");
set.add("스프링");
System.out.println("크기는? "+set.size()); // 스프링은 중복이니까 5가 아니라 4
System.out.println(set.contains("스프링")); // 스프링이 들어가 있는가? Yes => true
// Set은 선형구조가 아니라 순서대로 읽을 수 없다
// 전체 데이터를 엑세스하는 경우 표준 포맥인 Iterator로 변환 후 읽는다.
// => HashSet을 Iterator로 변환하기
Iterator<String> it = set.iterator();
// Iterator에 담긴 데이터 꺼내기
while(it.hasNext()) {//Iterator에 담긴 데이터가 있는 동안 반복작업
//(Iterator에 데이터가 있으면 true리턴, 없으면 false리턴)
String data = it.next(); // Iterator에 저장된 데이터 꺼내기
}
set.remove("스프링");
System.out.println("크기는??? "+set.size());
// HashSet을 배열로 변환
System.out.println("===============================================");
//set으로 배열객체를 생성
String[] myarr = new String[set.size()]; //set크기만큼의 배열 생성
//set을 배열로 변환
set.toArray(myarr); //myarr배열에 set의 데이터를 저장
//String[] myarr = set.toArray(new String[0]); // set을 String배열 객체에 저장됨
// 사이즈가 0인 배열이 만들어지면서 배열로 변환
for (int i = 0; i < myarr.length; i++) {
System.out.println(myarr[i]);
}
System.out.println(myarr[0].length()); // myarr[0] 값의 문자열의 길이를 출력. java이므로 4
}
}
* 주의할 점
int size = list.size();
for(String str : list) {
System.out.println(str);
}
=> for문 조건 안에 list.size()를 넣게 되면 size메소드가 계속 반복되면서 사용하는 공간이 늘어나게 됨
꼭! 새로 변수 선언을 한 후 담아주기.
- HashSet의 합집합, 교집합
package datastructure;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashSetTest2 {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
set.add("java");
set.add("서블릿");
set.add("js");
set.add("스프링");
set.add("css");
set.add("오라클");
set.add("html");
print(set);
//합집합 - set을 생성할 때 매개변수로 또 다른 set객체를 넘기기
HashSet<String> set2 = new HashSet<String>(set);
set2.add("hadpop");
set2.add("had");
set2.add("pop");
print(set2);
//교집합
//set3의 데이터 + set3과 set이 겹치는 데이터만 담는다.
HashSet<String> set3 = new HashSet<String>();
set3.add("java");
set3.add("python");
set3.add("python2");
set3.add("html");
print(set3);
System.out.println("set2와 set3의 합집합");
set2.addAll(set3); //주어진 컬렉션에 저장된 모든 객체들을 추가한다.
print(set2);
System.out.println("set3와 set의 교집합 - 교집합이 set3에 새로 설정");
set3.retainAll(set); //set3과 set이 겹치는 데이터만 담는다. => java, html
print(set3);
}
public static void print(Set<String> set) {
System.out.println("요소의 갯수 : "+set.size());
Iterator<String> it = set.iterator();
while(it.hasNext()) {
System.out.println("set에 저장된 요소 => "+it.next());
}
System.out.println("---------------------------------");
}
}
- HashSet의 차집합
package datastructure;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashSetTest3 {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
set.add("java");
set.add("jsp");
set.add("서블릿");
set.add("스프링");
set.add("오라클");
set.add("css");
set.add("swing");
print(set);
HashSet<String> set2 = new HashSet<String>();
set2.add("java");
set2.add("jsp");
print(set2);
HashSet<String> set3 = new HashSet<String>();
set3.add("java");
set3.add("jsp");
set3.add("hadoop");
set3.add("android");
print(set3);
System.out.println(set.containsAll(set2));
System.out.println(set.containsAll(set3)); // set에 없는 요소가 있기 때문에 false
set3.removeAll(set); // set의 내용 없애버림
print(set3);
}
- List, HashSet, HashMap 자유롭게 변경하기
* toArray등 메소드 사용하지 않고 직접 해보기
package datastructure;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Exam {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("java");
list.add("서블릿");
list.add("js");
list.add("스프링");
list.add("스프링");
HashSet<String> set = new HashSet<String>();
set.add("java");
set.add("jsp");
set.add("서블릿");
set.add("스프링");
set.add("오라클");
set.add("css");
set.add("swing");
HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "java");
map.put(2, "servlet");
map.put(3, "spring");
map.put(4, "swing");
print(list);
print(set);
print(map.values());
String[] listarr = change(list);
// 1. listarr의 값 출력하기
System.out.println("1번 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
for(String data : listarr) {
System.out.println("main : "+data);
}
ArrayList<String> setlist = change(set);
// 2. setlist의 값 출력하기
System.out.println("2번 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
for(String data : setlist) {
System.out.println("main : "+data);
}
// 3. 3번에서 만든 메소드 호출하고 값 출력하기
System.out.println("3번 =================================");
String[] arr = prinyMapKey(map);
for(String str : arr) {
System.out.println(str);
}
}
// 모든 자료구조의 값들을 출력할 수 있도록 작성하기
//main-> static메소드. static메소드에서 non-static 메소드를 호출하기 위해서는 객체생성 해줘야 함(혹은 메소드에 static붙이기).
// => Exam obj = new Exam();
public static void print(Collection<String> data) { // 컬렉션에 들어갈 데이터타입은 String이다.
// Iterator<String> it = data.iterator();
// while(it.hasNext()) {
// System.out.println(it.next()+"\t");
// }
for(String str : data) {
System.out.println(str+"\t");
}
System.out.println("--------------------------------------------------");
}
// 1. ArrayList를 배열로 변환해서 리턴하기
public static String[] change(ArrayList<String> list) {
String[] listarr = new String[list.size()];
int size = list.size();
for (int i = 0; i < size; i++) {
listarr[i] = list.get(i);
}
return listarr;
}
// 2. HashSet을 ArrayList로 변환해서 리턴하기
public static ArrayList<String> change(Set<String> set) {
ArrayList<String> setlist = new ArrayList<String>(set.size());
Iterator<String> it = set.iterator();
while (it.hasNext()) {
setlist.add(it.next()); //Set의 데이터가 setlist에 담김
}
return setlist;
}
// 3. Map의 키와값들을 추출하여 sysout으로 출력하고 value는 String[]에 담아 리턴하기
public static String[] prinyMapKey(HashMap<Integer, String> map) {
String[] myarr = new String[map.size()];
Set<Integer> keylist = map.keySet();
Iterator<Integer> it = keylist.iterator();
int i=0;
while(it.hasNext()) {
int key = it.next();
System.out.println("key"+key);
myarr[i] = map.get(key);
i++;
}
return myarr;
}
}
'JAVA' 카테고리의 다른 글
2022-10-31 greedy알고리즘, 재귀알고리즘 (0) | 2022.11.01 |
---|---|
2022-10-28 정렬 알고리즘 - 버블 정렬, 단순 삽입 정렬, API, greedy 알고리즘 (0) | 2022.10.29 |
2022-10-25 입출력 I/O (0) | 2022.10.28 |
2022-10-24 *배열로 스택클래스 구현하기 (0) | 2022.10.24 |
2022-10-24 Arrays클래스, Stack / Queue, 검색 알고리즘 - 선형검색, 이진검색, 정렬 알고리즘 - 단순 선택 정렬 (0) | 2022.10.24 |
댓글