반응형
set
- 보따리 구조. 순서를 유지하지 않음
- 인덱스가 없음
- 중복 허용 안됨
- java.util 패키지 import 필요
- 넣을 때 순서를 꺼낼 때 유지하지 않음
- 일반 for문으로는 출력 불가능
1) new String(), new Integer() 로 같은 값을 넣어도 이미 각 클래스에서
hashCode()와 equals()가 재정의되어 있기 때문에 동등 객체로 판별하고 중복값을 넣지 않음
Set<String> strSet = new HashSet<>();
strSet.add("A");
strSet.add("B");
strSet.add(new String("A"));
//마지막 추가 데이터인 "A"는 중복 객체이므로 추가될 수 없다.
System.out.println("strSet의 원소 갯수:"+strSet.size()); //2
String str1 = "A";
String str2 = new String("A");
System.out.println(str1 == str2);
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
System.out.println(str1.equals(str2));
Set<Integer> intSet = new HashSet<>();
intSet.add(10);
intSet.add(20);
intSet.add(new Integer(10));
intSet.add(new Integer(20));
System.out.println("intSet의 원소 갯수:"+intSet.size()); //2
2) Member 클래스를 Set에 넣고 객체 확인할 때
Member 클래스에서는 hashCode()와 equals()가 재정의 되어 있지 않기 때문에 원소 개수는 3개가 나온다
public class Member { //회원클래스
private String name; //이름
private int no; //회원번호
private String id; //아이디
private String password;//비밀번호
private int age; //나이
private String addr; //주소
public Member(String name, int no, String id, String addr, int age) {
this.name = name;
this.no = no;
this.id = id;
this.addr = addr;
this.age = age;
}
public Member(String name,int no, String id) {
this.name = name;
this.no = no;
this.id = id;
}
public String getName() { return name; }
public int getNo() { return no; }
public String getId() { return id; }
public String getPassword() { return password; }
public int getAge() { return age; }
public String getAddr() { return addr; }
public void setName(String name) { this.name = name; }
public void setNo(int no) { this.no = no; }
public void setId(String id) { this.id = id; }
public void setPassword(String password) { this.password = password; }
public void setAge(int age) { this.age = age; }
public void setAddr(String addr) { this.addr = addr; }
}
Set<Member> memberSet = new HashSet<>();
memberSet.add(new Member("홍길동",100,"hong001"));
memberSet.add(new Member("홍길동",200,"hong002"));
memberSet.add(new Member("홍길동",100,"hong001"));
System.out.println("memberSet의 원소 갯수:"+memberSet.size()); //3
Member 클래스에서 no와 id 필드가 같으면 HashSet에서 동등객체로 판별할 수 있도록
hashCode() 메소드와 equals() 메소드를 재정의하기
Member 클래스 안에 Override 해주면 됨
@Override
public int hashCode() {
return no + id.hashCode();
}
@Override
public boolean equals(Object o) {
if(o instanceof Member) {
Member target = (Member)o;
if(id.equals(target.id) && no == target.no) {
return true;
}
}
return false;
}
재정의 이후로 출력하면 2개 나온다
System.out.println("memberSet의 원소 갯수:"+memberSet.size()); //2
3) Student도 마찬가지
public class Student {
private String name;
private String schoolNM;
private int age;
public Student(String name,String schoolNM,int age) {
this.name = name;
this.schoolNM = schoolNM;
this.age = age;
}
public String getName() { return name; }
public String getSchoolNM() { return schoolNM; }
public int getAge() { return age; }
public void setName(String name) { this.name = name; }
public void setSchoolNM(String schoolNM) { this.schoolNM = schoolNM; }
public void setAge(int age) { this.age = age; }
}
Set<Student> studentSet = new HashSet<>();
studentSet.add(new Student("홍길동","동학교",20));
studentSet.add(new Student("김길동","북학교",30));
studentSet.add(new Student("홍길동","서학교",24));
studentSet.add(new Student("홍길동","동학교",22));
studentSet.add(new Student("홍길동","동학교",20));
System.out.println("studentSet의 원소 갯수:"+studentSet.size());
재정의 전에는 원소 갯수가 5개가 나온다
Student 클래스에서 재정의하기
@Override
public int hashCode() {
return age + name.hashCode();
}
@Override
public boolean equals(Object o) {
if(o instanceof Student) {
Student s = (Student)o;
if(name.equals(s.name) && age == s.age) {
return true;
}
}
return false;
}
재정의 이후 원소 갯수 4개
System.out.println("studentSet의 원소 갯수:"+studentSet.size());
4) 학번이 같으면 동일한 학생이라고 가정하고 중복 저장이 되지 않도록 만들기
import java.util.*;
public class StudentHashSet {
public int studentNum;
public String name;
public StudentHashSet(int studentNum,String name) {
this.studentNum = studentNum;
this.name = name;
}
@Override
public int hashCode() {
return studentNum;
}
@Override
public boolean equals(Object o) {
if(o instanceof StudentHashSet) {
StudentHashSet s = (StudentHashSet)o;
if(studentNum == s.studentNum) {
return true;
}
}
return false;
}
public static void main(String[] args) {
Set<StudentHashSet> set = new HashSet<>();
set.add(new StudentHashSet(1,"홍길동"));
set.add(new StudentHashSet(2,"신용권"));
set.add(new StudentHashSet(1,"조민우"));
System.out.println("저장된 객체 수: " + set.size());
for(StudentHashSet s : set) {
System.out.println(s.studentNum + ":" + s.name);
}
}
}
출력결과)
저장된 객체 수: 2 1:홍길동 2:신용권 |
5) 일반 for문으로는 출력 불가능. 순서가 없기 때문
Set<String> strSet2 = new HashSet<>();
strSet2.add("A");
strSet2.add("Apple");
strSet2.add("Banana");
strSet2.add("Bird");
strSet2.add("C");
strSet2.add("Cat");
//향상된 for문. (일반 for문으로는 출력 불가능)
for(String str : strSet2) {
System.out.print(str + " ");
}
출력결과)
A Apple C Bird Cat Banana |
Iterator
- 정해진 순서는 없지만 한 줄로 줄을 세운다
- Iterator의 .hasNext() 반환이 true이면 다음 데이터 존재, false이면 다음 데이터 존재하지 않음
- next() : 실제 토큰을 내리고, 원소를 반환
- remove() : next()로 가져온 객체를 Set 컬렉션에서 제거
- Iterator는 재사용할 수 없음
- 한번 토큰 다 사용하면 다시 올릴 수 없음
- Iterator<E> => E는 담을 객체의 타입을 넣으면 된다
- java.util 패키지 import 필요
1) Iterator를 사용하여 출력하기
Iterator<String> strIterator = strSet2.iterator();
while(strIterator.hasNext()) {
System.out.print(strIterator.next() + " ");
}
출력결과)
A Apple C Bird Cat Banana |
2) strSet2 의 컬렉션 원소 중에 A 문자를 포함하는 원소의 갯수를 출력하는 실행문을 작성
향상된 for문
contains
int count = 0;
for(String str : strSet2) {
if(str.contains("A")) {
count++;
}
System.out.print(str + " ");
}
System.out.println();
System.out.println("A를 포함하는 원소의 갯수(향상된 for문.contains):"+count);
indexOf
int count = 0;
for(String str : strSet2) {
if(str.indexOf("A") > -1) {
count++;
}
System.out.print(str + " ");
}
System.out.println();
System.out.println("A를 포함하는 원소의 갯수(향상된 for문.contains):"+count);
Iterator 사용
Iterator<String> strIterator2 = strSet2.iterator();
count = 0;
while(strIterator2.hasNext()) {
String str = strIterator2.next();
if(str.indexOf("A") > -1) {
count++;
}
}
System.out.println("A를 포함하는 원소의 갯수(Iterator.indexOf):"+count);
3) remove() 사용
import java.util.*;
public class HashSetExample {
public static void main(String[] args) {
//HashSet 컬렉션 생성
Set<String> set = new HashSet<>();
//객체 추가
set.add("Java");
set.add("JDBC");
set.add("JSP");
set.add("Spring");
//객체를 하나씩 가져와서 처리
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()) {
//객체를 하나 가져오기
String element = iterator.next();
System.out.println(element);
if(element.equals("JSP")) {
//가져온 객체를 컬렉션에서 제거
iterator.remove();
}
}
System.out.println();
//객체 제거
set.remove("JDBC");
//객체를 하나씩 가져와서 처리
for(String element : set) {
System.out.println(element);
}
}
}
출력결과)
Java JSP JDBC Spring Java Spring |
4) Iterator를 사용하여 scores의 평균을 계산하여 출력하는 실행문을 작성
Set<Integer> scores = new HashSet<>();
scores.add(99);
scores.add(94);
scores.add(79);
scores.add(69);
scores.add(86);
Iterator<Integer> intIterator = scores.iterator();
int sum = 0;
while(intIterator.hasNext()) {
sum += intIterator.next();
}
System.out.println("평균: " + (double)sum/scores.size());
출력결과)
평균: 85.4 |
반응형
'Java' 카테고리의 다른 글
[Java] Map (0) | 2024.08.25 |
---|---|
[Java] set 연습 (0) | 2024.08.24 |
[Java] ArrayList, List 연습 (0) | 2024.08.21 |
[Java] 컬렉션 프레임워크 (0) | 2024.08.16 |
[Java] 제네릭 타입 (0) | 2024.08.15 |