728x90

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 다루기]

나이순 정렬 기능 추가

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);
    }
 
}
 
 

 

'안드로이드 > 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
블로그 이미지

Link2Me

,