import java.util.*;
public class ArrayList_Person_DupRemove {
public static void main(String[] args) {
ArrayList<Person> arr = new ArrayList<>();
arr.add(new Person("홍길동",25));
arr.add(new Person("이순신",35));
arr.add(new Person("강감찬",42));
arr.add(new Person("김수희",68));
arr.add(new Person("홍길동",25));
arr.add(new Person("강감찬",42));
arr.add(new Person("남진",75));
arr.add(new Person("나훈아",72));
arr.add(new Person("홍길동",29));
// HashSet(Set인터페이스를 구현한 대표적인 컬렉션 클래스)을 사용하여 중복 제거하기
Set<Person> arr2 = new HashSet<>(arr);
ArrayList<Person> resArr2 = new ArrayList<>(arr2);
System.out.println("중복값 제거후 결과값(순서없음) : " + resArr2.toString());
// 추가한 순서를 유지하며 중복 제거하려면 LinkedHashSet클래스를 사용
Set<Person> arr3 = new LinkedHashSet<>(arr);
ArrayList<Person> resArr3 = new ArrayList<>(arr3);
System.out.println("중복값 제거후 결과값(저장순서) : " + resArr3.toString());
// ArrayList 정렬 시 Collections.sort() 메소드를 사용한다.
Collections.sort(resArr2);
System.out.println("중복값 제거후 결과값(정렬순서) : " + resArr2.toString());
Collections.sort(resArr3);
System.out.println("중복값 제거후 결과값(정렬순서) : " + resArr3.toString());
// 역순 정렬
Collections.sort(resArr2,new Descending());
System.out.println("중복값 제거후 결과값(역순정렬) : " + resArr2.toString());
Collections.sort(resArr3,new Descending());
System.out.println("중복값 제거후 결과값(역순정렬) : " + resArr3.toString());
// 나이순 정렬
Collections.sort(resArr2,(a, b) -> Person.AgeCompareTo(a,b));
System.out.println("중복값 제거후 결과값(나이순서) : " + resArr2.toString());
Collections.sort(resArr2,(a, b) -> Person.DescAgeCompareTo(a,b));
System.out.println("중복값 제거후 결과값(나이역순) : " + resArr2.toString());
}
}
class Descending implements Comparator {
// 정렬 : 두 대상 비교하여 자리바꿈 반복
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Comparable && o2 instanceof Comparable) {
Comparable c1 = (Comparable)o1;
Comparable c2 = (Comparable)o2;
return c1.compareTo(c2)* -1; // -1을 곱해서 기본 정렬방식을 역으로 변경한다.
}
return -1;
}
}
// equals()와 hashCode()를 오버라이딩해야 HashSet이 바르게 동작한다.
class Person implements Comparable<Person> {
// 객체 정렬에 필요한 메소드(정렬기준 제공)를 정의한 인터페이스
// Comparable : 기본 정렬기준을 구현하는데 사용
// Comparator : 기준 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return name + ":" + age;
}
@Override
public int hashCode() {
// int hash(Object... values); // 가변인자
return Objects.hash(name,age);
// 동일 객체에 대해 hashCode()를 여러 번 호출해도 동일한 값을 반환해야 한다.
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Person)) return false;
Person p = (Person) obj;
// 나 자신(this)의 이름과 나이를 p와 비교
return this.name.equals(p.name) && this.age == p.age;
// equals()로 비교해서 true를 얻은 두 객체의 hashCode()값은 일치해야 한다.
}
// Comparable 인터페이스를 상속받아 compareTo() 함수를 오버라이딩
@Override
public int compareTo(Person p) {
// 주어진 객체(p)를 자신(this)과 비교
return this.name.compareTo(p.name);
}
// 나이순 정렬
public static int AgeCompareTo(Person p1, Person p2){
if(p1.age > p2.age) return 1;
else if(p1.age < p2.age) return -1;
else return 0;
}
// 나이 역순 정렬
public static int DescAgeCompareTo(Person p1, Person p2){
if(p1.age < p2.age) return 1;
else if(p1.age > p2.age) return -1;
else return 0;
}
}