Person 클래스를 ArrayList 로 입력하고, HashSet 을 이용하여 데이터 중복을 제거하고 정렬하는 예제이다.
| 
 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()); 
    } 
} 
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); 
    } 
} 
 | 
실행결과
ArrayList 로 입력한 데이터를 중복제거하고, 정렬하는 간단한 예제이다.
출처: https://link2me.tistory.com/1912 [소소한 일상 및 업무TIP 다루기]
출처: https://link2me.tistory.com/1912 [소소한 일상 및 업무TIP 다루기]
나이순 정렬 기능 추가
| 
 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; 
    } 
} 
 | 
불필요한 코드를 정리한 예제
| 
 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)); 
        arr.add(new Person("유재석",25)); 
        // 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,Comparator.comparing(Person::getAge) // 나이순정렬 
                .thenComparing(Comparator.naturalOrder())); // 기본정렬 
        System.out.println("중복값 제거후 결과값(나이정렬) : " + resArr2.toString()); 
        // 역순 정렬 
        Collections.sort(resArr2,Comparator.comparing(Person::getAge).reversed()); 
        System.out.println("중복값 제거후 결과값(나이역순) : " + resArr2.toString()); 
    } 
} 
// 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 getName() { 
        return name; 
    } 
    public int getAge() { 
        return 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); 
    } 
} 
 | 
728x90
    
    
  '안드로이드 > Java 문법' 카테고리의 다른 글
| [Java] Generics 예제1 (2) | 2021.11.10 | 
|---|---|
| HashMap 예제 (0) | 2021.10.30 | 
| [Java] HashSet 를 이용한 ArrayList 중복제거 및 단순 정렬 (0) | 2020.12.12 | 
| [Java] HashSet 예제 (0) | 2020.12.12 | 
| Java 와 C/C++ 비교 (0) | 2020.11.08 |