👨‍💻Programming/JAVA & C언어 예제

자바 - Java 컬렉션 : HashSet 예제 풀이

코너(Corner) 2020. 12. 9.
반응형

HashSet 예제 풀이

 

 

(1) 일반 배열 값 넣기 ( 자료형 다양하게 ) , HashSet에 배열을 담기.

(2) Student 클래스를 만들고 HashSet에 값을 넣고 출력하기.

(학교명, 학번, 번호)


 


소스 코드

public class HashSetEx02 {
	public static void main(String[] args) {
		// 배열 값 넣기 - 자료형 다양한 것
		Object[] objArr = { 1, 1.1, "a", 'a', true, "a", 1 };

		// onjArr의 배열에 있는 것을 HashSet에 넣기
		HashSet hashset = new HashSet(Arrays.asList(objArr));
		//asList를 사용하여 for문으로 담지 않아도 된다.
		
		// objArr의 배열에 있는 것을 HashSet에 넣기
		Set h = new HashSet();
		for (int i = 0; i < objArr.length; i++) {
			h.add(objArr[i]);
		}
		
		System.out.println(hashset);
		System.out.println(h);
		
		//출력하기
		Iterator it = h.iterator();
		while(it.hasNext()) {
			Object o = it.next();
			System.out.println(o);
		}
		// a는 문자열 2개라서 중복을 제거하여 1개만 나옴
		// 'a' char 문자형은 문자열과는 다르기 때문에 중복이라고 볼 수 없다.
		// 즉 문자열 a와 문자형 a가 있는 것이다.

	}
}

class Person {
	String name;
	int age; // 이름과 나이를 넣어줌

	public Person() {
	} // default 생성자 하나주고

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

// 요구사항에 따라서 같은 사람을 판단할 기준으로 hashCode() equals() 메소드로 구현해준다.
	@Override
	public int hashCode() {
		return (name+age).hashCode();
	}
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Person) {
			Person p = (Person) obj;
			return name.equals(p.name) && age==p.age;
			// 들어올 이름이 홍길동이냐, 들어올 나이가 30이냐. 두개가 참이여야지 참이다.
		}
		return false; // 다른 객체, false 리턴
	}

}

public class HashSetEx04 {

	public static void main(String[] args) {

		// 사용자 만든 클래스의 멤버들을 Set넣기
		Set<Person> set = new HashSet<Person>(); // person 클래스 참조변수로 담는다.
		set.add(new Person("홍길동", 30));
		set.add(new Person("할명수", 51)); // add에 person 객체 생성하면서 값 삽입
		Person p1 = new Person("김수지", 14);
		set.add(p1); // 같은것이다.
		set.add(new Person("홍길동", 30));
		// 홍길동,30이 같은 값을 가져있는데도 불구하고 중복이 저장되어 출력이 잘 나온다.
		// ==> 번지(레퍼런스) 수가 다르기 때문에 중복이라고 볼 수 없다고 하는것이다.
		// char 'a' 와 String "a" 와 같은 경우이다.
		// ==> equals와 hashcode를 override 하게되면 중복을 찾을 수 있다.
		
		
		Set<String> string = new HashSet<String>(); //
		string.add("홍길동");
		string.add("홍길동");
		string.add(new String("홍길동"));
		System.out.println(string);
		// 기본형(data type),String 같은 자료타입은 같은 번지를 참조하고 있기 때문에 중복을 제거한다.
		// 클래스의 경우 레퍼런스가 계속 생성 되기 때문에 같은 번지를 참조할 수 없다.고 생각하면 될 듯 하다.

		System.out.println(set);

		Iterator<Person> it = set.iterator();
		while (it.hasNext()) {
			Person po = it.next();
			System.out.println(po);
		}
        
     }
class Student{
	String school; // 학교 
	int snum; // 학번 
	int num; // 번호
	
	public Student() {	}
	public Student(String school, int snum, int num ) {
		this.school=school; this.snum=snum; this.num=num;
	}
	@Override
	public String toString() {
		return "Student [학교=" + school + ", 학번=" + snum + ", 번호=" + num + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + num;
		result = prime * result + ((school == null) ? 0 : school.hashCode());
		result = prime * result + snum;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (num != other.num)
			return false;
		if (school == null) {
			if (other.school != null)
				return false;
		} else if (!school.equals(other.school))
			return false;
		if (snum != other.snum)
			return false;
		return true;
	}
	
	
}

public class HashSetEx03 {

	public static void main(String[] args) {

	//--------------------- Student 
	Set<Student> stu = new HashSet<Student>();
	stu.add(new Student("서울대", 2018, 10));	
	stu.add(new Student("서울대", 2018, 20));
	stu.add(new Student("서울대", 2018, 15));
	stu.add(new Student("서울대", 2018, 10));
	stu.add(new Student("아주대", 2020, 30));
	stu.add(new Student("아주대", 2020, 30));
	stu.add(new Student("아주대", 2020, 30));
	stu.add(new Student("고려대", 2019, 10));
	stu.add(new Student("고려대", 2019, 10));
	
	// ----- 출력 
	Iterator<Student> itstu = stu.iterator();
	while(itstu.hasNext() ) {
		Student objStu = itstu.next();
		System.out.println(objStu);
	}

	}
}

 


 

반응형

댓글