-
[12회차-③]JAVA (컬렉션 Set 인터페이스, Map 인터페이스)JAVA 2021. 4. 8. 04:00
강의명 : 오픈프레임워크 활용 디지털융합 SW엔지니어 양성 과정
강의 날짜 : 21.04.07
<컬렉션-②>
1. Set 인터페이스
원소의 중복을 허용하지 않는다.
클래스명 설명 HashSet 해쉬테이블에 원소 저장하여 성능면에서 우수
하지만 순서가 일정하지 않은 단점TreeSet 값에 따라 순서가 결정 LinkedHash 해쉬 테이블과 연결리스트가 결합
순서는 삽입 순서와 같다2. Set - HashSet 클래스
HashSet은 입력한 순서와 저장된 순서가 따로 없다.
순서가 필요한 경우는 LinkedListSet이나 TreeSet 사용한다.
String 클래스에 객체가 동일한 경우에 대한 처리 방법이 이미 구현되어 있어 중복값은 또 입력되지 않는다.
package april7th; import java.util.HashSet; public class SetTest { public static void main(String[] args) { HashSet<String> set = new HashSet<String>(); set.add("MILK"); set.add("Bread"); set.add("Butter"); set.add("Cheese"); set.add("Ham"); set.add("Ham"); System.out.println(set); } }
중복된 값이 들어가지 않았으며 그 순서도 뒤죽박죽이다. 집합 연산을 할때는 복사본을 가지고 하는 것이 데이터 보존에 안전하다.
package april7th; import java.util.HashSet; import java.util.Set; public class SetTest1 { public static void main(String[] args) { Set<String> s1=new HashSet<String>(); Set<String> s2=new HashSet<String>(); s1.add("A"); s1.add("B"); s1.add("C"); s2.add("A"); s2.add("D"); Set<String> union = new HashSet<String>(s1); //s1집합을 가진 HashSet을 참조하는 Set union union.addAll(s2); //s2의 원소 삽입 Set<String> intersection = new HashSet<String>(s1); intersection.retainAll(s2); //s2와 s1의 교집합 Set<String> removeall = new HashSet<String>(s1); removeall.removeAll(s2); //s1-s2 System.out.println("합집합 "+union); System.out.println("교집합 "+intersection); System.out.println("차집합 "+removeall); } }
*활용
package april7th_1; //패키지를 다르게 설정해준다! public class Member { private int memberID; //회원번호 private String memberName; //회원명 public Member(int memberID,String memberName) { //생성자 this.memberID=memberID; this.memberName=memberName; } public int getMemberID() { //회원번호 반환하는 메소드 return memberID; } public void setMemberID(int memberID) { //회원번호 설정하는 메소드 this.memberID=memberID; } public String getMemberName() { //회원명 반환하는 메소드 return memberName; } public void setMemberName(String memberName) { //회원명 설정하는 메소드 this.memberName=memberName; } public String toString() { return memberName+" 회원님의 아이디는 "+memberID+"입니다."; } //중복처리 @Override public int hashCode() { return memberID; } @Override public boolean equals(Object obj) { if(obj instanceof Member) { Member member=(Member)obj; if(this.memberID==member.memberID) return true; } return false; } }
package april7th; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import april7th_1.Member; //다른 패키지의 클래스 Member import! public class MemberHashSet { private HashSet<Member> hashset; //Member클래스형의 HashSet public MemberHashSet() { //생성자 hashset=new HashSet<Member>(); } public void addMember(Member member) { hashset.add(member); } public boolean removeMember(int memberID) { Iterator<Member> ir=hashset.iterator(); //반복자 사용 while(ir.hasNext()) { Member member =ir.next(); int tempID=member.getMemberID(); if(tempID==memberID) { hashset.remove(member); return true; } } System.out.println(memberID+"가 존재하지 않습니다"); return false; } public void showAllMember() { for(Member member : hashset) { System.out.println(member); } System.out.println(); } }
package april7th; import april7th_1.Member; //import! public class MemberHashSetTest { public static void main(String[] args) { MemberHashSet memberhashset=new MemberHashSet(); //Member형 객체들 생성 Member memberLee=new Member(1001,"이지원"); Member memberSon=new Member(1002,"손민국"); Member memberPark=new Member(1003,"박서훤"); //객체들을 HashSet에 삽입 memberhashset.addMember(memberLee); memberhashset.addMember(memberSon); memberhashset.addMember(memberPark); memberhashset.showAllMember(); Member memberHong=new Member(1003,"홍길동"); //중복 데이터 memberhashset.addMember(memberHong); //오버라이딩했으므로 삽입 안 됨 memberhashset.showAllMember(); } }
회원번호가 중복이라 홍길동이 들어가지 않은 것 확인 3. Set - TreeSet 클래스
순서대로 정렬되어 출력된다.
package april7th; import java.util.TreeSet; public class TreeSetTest { public static void main(String[] args) { TreeSet<String> treeset=new TreeSet<String>(); treeset.add(new String("임정순")); treeset.add(new String("박현정")); treeset.add(new String("홍연의")); treeset.add(new String("강감찬")); System.out.println(treeset); } }
가나다 순서로 정열된 집합 4. Comparable 인터페이스
정렬을 구현할 수 있게 해주는 인터페이스이다.
자기 자신과 전달받은 매개변수를 비교하는 compareTo() 추상메소드가 포함되어 있다.
두 값 중 자기 자신이 더 크면 양수를 반환하여 오름차순으로 정렬된다.
매개변수가 더 크면 음수를 반환하여 내림차순으로 정렬된다.
package april7th_1; //패키지를 다르게 설정해준다! public class Member implements Comparable<Member>{ //Member형을 받는 Comparable인터페이스 구현 private int memberID; //회원번호 private String memberName; //회원명 public Member(int memberID,String memberName) { //생성자 this.memberID=memberID; this.memberName=memberName; } public int getMemberID() { //회원번호 반환하는 메소드 return memberID; } public void setMemberID(int memberID) { //회원번호 설정하는 메소드 this.memberID=memberID; } public String getMemberName() { //회원명 반환하는 메소드 return memberName; } public void setMemberName(String memberName) { //회원명 설정하는 메소드 this.memberName=memberName; } public String toString() { return memberName+" 회원님의 아이디는 "+memberID+"입니다."; } //중복처리.HashSet을 위한 구현 @Override public int hashCode() { return memberID; } @Override public boolean equals(Object obj) { if(obj instanceof Member) { Member member=(Member)obj; if(this.memberID==member.memberID) return true; } return false; } @Override public int compareTo(Member member) { //TreeSet을 위한 구현 return (this.memberID-member.memberID)*(-1); //내림차순 //오름차순일때는 (this.memberID-member.memberID); } }
package april7th; import java.util.HashSet; import java.util.Iterator; import java.util.TreeSet; import april7th_1.Member; public class MemberTreeSet { private TreeSet<Member> treeset; //Member형을 받는 TreeSet형의 treeset public MemberTreeSet() { //생성자 treeset=new TreeSet<Member>(); } public void addMember(Member member) { treeset.add(member); } public boolean removeMember(int memberID) { Iterator<Member> ir=treeset.iterator(); //반복자 while(ir.hasNext()) { Member member =ir.next(); int tempID=member.getMemberID(); if(tempID==memberID) { treeset.remove(member); return true; } } System.out.println(memberID+"가 존재하지 않습니다"); return false; } public void showAllMember() { for(Member member : treeset) { System.out.println(member); } System.out.println(); } }
package april7th; import april7th_1.Member; //import! public class MemberTreeSetTest { public static void main(String[] args) { MemberTreeSet membertreeset = new MemberTreeSet(); //Member형 객체 생성 Member memberPark = new Member(1003,"박서훤"); Member memberLee = new Member(1001,"이지원"); Member memberSon = new Member(1002,"송민국"); //TreeSet에 객체 삽입 membertreeset.addMember(memberLee); membertreeset.addMember(memberSon); membertreeset.addMember(memberPark); membertreeset.showAllMember(); Member memberHong=new Member(1003,"홍길동"); //중복데이터 membertreeset.addMember(memberHong); membertreeset.showAllMember(); } }
이름 내림차순으로 정렬된 것 확인 5. Comparator 인터페이스
정렬을 구현하는 데 사용하는 인터페이스이다.
두 매개변수를 두 개 받아 이것들을 비교하여 정렬한다.
첫 번째 매개변수가 더 크면 양수를 반환하여 오름차순으로 정렬한다.
단, 유의할 점은 TreeSet 생성자에 Comparator를 구현할 객체를 매개변수로 전달해야 한다.
package april7th; import java.util.Comparator; public class MyCompare implements Comparator<String>{ //인터페이스 구현 @Override public int compare(String s1, String s2) { return (s1.compareTo(s2))*-1; //내림차순 } }
package april7th; import java.util.Set; import java.util.TreeSet; public class MyCompareTest { public static void main(String[] args) { Set<String> set = new TreeSet<String>(new MyCompare()); //역순으로 뽑아주기 위해 괄호 안에 MyCompare()를 넣어준다 set.add("aaa"); set.add("ccc"); set.add("bbb"); System.out.println(set); } }
내림차순으로 정렬됨 6. List - LinkedHashSet 클래스
package april7th; import java.util.LinkedHashSet; public class LinkedHashSetTest { public static void main(String[] args) { LinkedHashSet<String> linkedhashset=new LinkedHashSet<String>(); linkedhashset.add(new String("임정순")); linkedhashset.add(new String("박현정")); linkedhashset.add(new String("홍연의")); linkedhashset.add(new String("강감찬")); System.out.println(linkedhashset); } }
삽입한 순서대로 정열된 집합 7. Map 인터페이스
많은 데이터 중에서 원하는 데이터를 빠르게 찾을 수 있는 자료구조이다.
사전과 같은 자료구조이다.
자료를 쌍으로 관리하는데 필요한 메소드가 정의되어 있다.
HashMap, TreeMap이 해당된다.
8. Map - HashMap 클래스
해시방식으로 자료를 관리한다.
key-value 자료 사용한다.
자료 추가 속도나 검색 속도가 상당히 빠르다는 것이 장점이다.
package april7th; import java.util.HashMap; import java.util.Map; class Student{ int number; String name; public Student(int number,String name) { //생성자 this.number=number; this.name=name; } public String toString() { return name; } } public class MapTest { public static void main(String[] args) { Map<String,Student> st=new HashMap<String,Student>(); //HashMap을 참조하는 Map객체 생성 st.put("20090001", new Student(20090001,"구준표")); st.put("20090002", new Student(20090002,"금잔디")); st.put("20090003", new Student(20090003,"윤지후")); System.out.println(st); //출력 st.remove("20090002"); //해당 원소 삭제 st.put("20090003", new Student(20090003,"소이정")); //새로운 Student 객체를 대체삽입 System.out.println(st.get("20090003")); //해당 원소 반환 출력 for(Map.Entry<String, Student> s : st.entrySet()) { //Map.Entry는 Map의 nested class로 key와 value로 하나의 쌍을 이룬다 //entrySet()은 해당 객체에서 key값과 value값을 가져와 반환한다. String key = s.getKey(); Student value = s.getValue(); System.out.println("key="+key+", value="+value); } } }
9. Map - TreeMap 클래스
key값으로 자료를 정렬하기 위해 TreeMap을 사용한다.
key값으로 정렬하기 때문에 Comparable이나 Comparator인터페이스를 구현해야 한다.
package april7th_1; //패키지를 다르게 설정해준다! public class Member implements Comparable<Member>{ //Member형을 받는 Comparable인터페이스 구현 private int memberID; //회원번호 private String memberName; //회원명 public Member(int memberID,String memberName) { //생성자 this.memberID=memberID; this.memberName=memberName; } public int getMemberID() { //회원번호 반환하는 메소드 return memberID; } public void setMemberID(int memberID) { //회원번호 설정하는 메소드 this.memberID=memberID; } public String getMemberName() { //회원명 반환하는 메소드 return memberName; } public void setMemberName(String memberName) { //회원명 설정하는 메소드 this.memberName=memberName; } public String toString() { return memberName+" 회원님의 아이디는 "+memberID+"입니다."; } //중복처리.HashSet을 위한 구현 @Override public int hashCode() { return memberID; } @Override public boolean equals(Object obj) { if(obj instanceof Member) { Member member=(Member)obj; if(this.memberID==member.memberID) return true; } return false; } @Override public int compareTo(Member member) { //TreeSet을 위한 구현 return (this.memberID-member.memberID)*(-1); //내림차순 //오름차순일때는 (this.memberID-member.memberID); } }
package april7th; import java.util.HashMap; import java.util.Iterator; import java.util.TreeMap; import april7th_1.Member; //import! public class MemberTreeMap { private TreeMap<Integer,Member> treeMap; //TreeMap이 받는 자료형 두 개 public MemberTreeMap() { //생성자 treeMap=new TreeMap<Integer,Member>(); } public void addMember(Member member) { treeMap.put(member.getMemberID(), member); } public boolean removeMemberID(int memberID) { if(treeMap.containsKey(memberID)) { //트리맵이 매개변수를 key로 가지고 있으면 treeMap.remove(memberID); //삭제 return true; } System.out.println(memberID+"가 존재하지 않습니다"); return false; } public void showAllMenmber() { Iterator<Integer> ir=treeMap.keySet().iterator(); while(ir.hasNext()) { int key=ir.next(); Member member= treeMap.get(key); System.out.println(member); } System.out.println(); } }
package april7th; import april7th_1.Member; //import! public class MemberTreeMapTest { public static void main(String[] args) { MemberTreeMap membertreemap=new MemberTreeMap(); //Member 객체 생성 Member memberPark=new Member(1003,"박서훤"); Member memberLee=new Member(1001,"이지원"); Member memberHong=new Member(1004,"홍길동"); Member memberSon=new Member(1002,"손민국"); //TreeMap에 삽입 membertreemap.addMember(memberLee); membertreemap.addMember(memberSon); membertreemap.addMember(memberPark); membertreemap.addMember(memberHong); membertreemap.showAllMenmber(); membertreemap.removeMemberID(1004); //1004 key값 가진 Member 삭제 membertreemap.showAllMenmber(); } }
'JAVA' 카테고리의 다른 글
[14회차-①] JAVA (스트림) (0) 2021.04.11 [13회차] JAVA (컬렉션 메소드,스레드) (0) 2021.04.08 [12회차-②] JAVA (컬렉션 List 인터페이스) (0) 2021.04.08 [12회차-①] JAVA (제네릭-②) (0) 2021.04.08 [11회차-②] JAVA (제네릭-①) (0) 2021.04.06