본문 바로가기

C#

[C#] 복잡한 리스트 중복제거

반응형

복잡한 리스트 중복 제거

List<int> 등 간단한 형식의 리스트도 있지만,
Person이라는 class의 집합인 List<Person> 등의 복잡한 리스트도 있을 것이다.

https://iyabong.tistory.com/entry/Java-HashSet%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%A4%91%EB%B3%B5%EC%A0%9C%EA%B1%B0hashCode-equals-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%93%9C

 

[Java] HashSet을 이용한 중복제거(hashCode, equals 오버라이드)

공업/방업 수치가 동일한 저글링은 같은 저글링으로 가정하고, 중복 제거하여 1기로 취급하도록 구현 1. 저글링 클래스 package prac01; public class Zergling { // 필드 String name;// 유닛명 int attackUp;// 공업

iyabong.tistory.com

 


GetHashCode/ Equals 메소드를 사용

GetHashCode와 Equals 메소드를 오버라이드해서 중복 제거를 하는 것 같은데...
솔직히 시도해보았지만 잘 되진 않았다.

 


1. 저글링 클래스

package prac01;

public class Zergling {
	// 필드
	String name;		// 유닛명
	int attackUp;		// 공업 단계(0~3)
	int armorUp;		// 방업 단계(0~3)
	
	// 생성자
	public Zergling(String name, int attackUp, int armorUp) {
		this.name = name;
		this.attackUp = attackUp;
		this.armorUp = armorUp;
	}
	
	@Override
	public String toString() {
		return "Zergling [name=" + name + ", attackUp=" + attackUp + ", armorUp=" + armorUp + "]";
	}
	
}

 

2.1. HashSet을 이용한 중복제거 실행 클래스

package prac01;

import java.util.HashSet;
import java.util.Set;

public class ZerglingMain {
	public static void main(String[] args) {
		Set<Zergling> set = new HashSet<>();
		
		Zergling z1 = new  Zergling("Zergling", 0, 0);		// 노업 저글링
		Zergling z2 = new  Zergling("Zergling", 0, 0);		// 노업 저글링
		Zergling z3 = new  Zergling("Zergling", 0, 0);		// 노업 저글링
		Zergling z4 = new  Zergling("Zergling", 3, 0);		// 공3업 저글링
		Zergling z5 = new  Zergling("Zergling", 3, 3);		// 풀업 저글링
		Zergling z6 = new  Zergling("Zergling", 3, 3);		// 풀업 저글링
		Zergling z7 = new  Zergling("Zergling", 1, 1);		// 공방1업 저글링
		
		set.add(z1);
		set.add(z2);
		set.add(z3);
		set.add(z4);
		set.add(z5);
		set.add(z6);
		set.add(z7);
		
		System.out.println("set.size(): " + set.size());
		for (Zergling z : set) {
			System.out.println(z.hashCode());
			System.out.println(z);
		}
		
	}
}

2.2. 실행결과

set.size(): 7
2046562095
Zergling [name=Zergling, attackUp=0, armorUp=0]
932172204
Zergling [name=Zergling, attackUp=3, armorUp=3]
1225358173
Zergling [name=Zergling, attackUp=1, armorUp=1]
1342443276
Zergling [name=Zergling, attackUp=0, armorUp=0]
1587487668
Zergling [name=Zergling, attackUp=3, armorUp=0]
1199823423
Zergling [name=Zergling, attackUp=3, armorUp=3]
769287236
Zergling [name=Zergling, attackUp=0, armorUp=0]

※ 중복제거 실패

 

3.1. 저글링 클래스 보완(hashCode, equals 메소드 재정의)

package prac01;

public class Zergling {
	// 필드
	String name;		// 유닛명
	int attackUp;		// 공업 단계(0~3)
	int armorUp;		// 방업 단계(0~3)
	
	// 생성자
	public Zergling(String name, int attackUp, int armorUp) {
		this.name = name;
		this.attackUp = attackUp;
		this.armorUp = armorUp;
	}
	
	@Override
	public int hashCode() {
		return this.name.hashCode() + this.attackUp + this.armorUp;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Zergling) {
			Zergling tmp = (Zergling)obj;
			if (this.attackUp == tmp.attackUp && this.armorUp == tmp.armorUp) {
				return true;
			}
		}
		return false;
	}

	@Override
	public String toString() {
		return "Zergling [name=" + name + ", attackUp=" + attackUp + ", armorUp=" + armorUp + "]";
	}
	
}

 

3.2. 저글링 클래스 보완 후 재실행 결과

set.size(): 4
744866486
Zergling [name=Zergling, attackUp=0, armorUp=0]
744866492
Zergling [name=Zergling, attackUp=3, armorUp=3]
744866489
Zergling [name=Zergling, attackUp=3, armorUp=0]
744866488
Zergling [name=Zergling, attackUp=1, armorUp=1]

※ 중복제거 성공 (공업, 방업 수치가 동일한 저글링은 같은 개체로 취급)

 

 

참조
marobiana.tistory.com/100
superfelix.tistory.com/61
반응형