본문 바로가기

알고리즘/알고리즘 개념 정리

[java] Comparable, Comparator

TreeSet의 객체

TreeMap의 키는 

저장과 동시에 자동 오름차순으로 정렬된다.

 

 

숫자 타입(Integer, Double):    숫자 값으로 정렬

문자 타입(String):                 유니코드 정렬

 

System.out.println(Arrays.toString(str));// [3, 30, 9]
Arrays.sort(str, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) { // 3, 30 --> 303 vs 330 : -1 리턴
    System.out.println("compare:: "+o1+"   "+o2);//compare:: 30   3 // compare:: 9   30
    System.out.println((o2+o1).compareTo(o1+o2));// 3 // -6
    return (o2+o1).compareTo(o1+o2);//문자열 비교 int 반환
    // A.compareTo(B) A는 B보다 작다 : -1 리턴 -> 자리 바꿈
    // B.compareTo(A) B는 A보다 크다 : 1 리턴 -> 자리 안바꿈
     }
});

 

Comparable

리턴 타입 메소드 설명
int compareTo(객체) 주어진 객체와 같으면 0 리턴
주어진 객체보다 작으면 음수 리턴
주어진 객체보다 크면 양수 리턴

재정의(오버라이딩)하며 쓴다

public class Person implements Comparable<Person> {

    public String name;
    public int age;

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


    @Override
    public int compareTo(Person o) {
        if(age<o.age){ // 1-4 = -3
            return -1; //오름차순
        }else if (age == o.age){
            return 0;
        }else
            return 1;
    }
}

main

package com.company;

import java.util.Iterator;
import java.util.TreeSet;

public class test15 {

    public static void main(String[] args) {
        TreeSet<Person> treeSet = new TreeSet<Person>();
        treeSet.add(new Person("홍길동",45));
        treeSet.add(new Person("홍길동2",25));
        treeSet.add(new Person("홍길동3",31));

        // 자동정렬 => 출력 === 그냥 오름차순
        Iterator<Person> iter = treeSet.iterator();
        while (iter.hasNext()){
            Person person = iter.next();//값(Person객체) 가져오기
            System.out.println(person.name+"  "+person.age);
        }
    }
}

treeSet 오름차순

Comparator

리턴 타입 메소드 설명
int compare(객체1, 객체2) 객체1과 객체2 같으면 0 리턴
객체1보다 객체2가 앞에 오려면 음수 리턴 
객체2보다 객체1이 앞에 오려면 양수 리턴

숫자를 문자로 바꿔서 내림차순을 사용한다.

내림차순의 두번째 파라미터는 함수가 오나보다.

Arrays.sort(string_array, Collections.reverseOrder() );//내림 정렬

Arrays.sort(str, new Comparator<String>() {
                                                  @Override
                                                   public int compare(String o1, String o2) {
                                                   return (o2+o1).compareTo(o1+o2);
                                                    }
}); // 문자를 합친 것을 비교함

 

package com.company;

import java.util.Arrays;
import java.util.Comparator;

public class programmers3_1 {

    public static void main(String[] args) {
     //https://programmers.co.kr/learn/courses/30/lessons/42746
        int[] numbers = {3, 30, 34, 5, 9};
        int[][] commands = {{2, 5, 3}, {4, 4, 1}, {1, 7, 3}};
        String str ="";
        String result = Solution.solution(numbers);
    }
    static class Solution {
        public static String solution(int[] numbers) {
            String answer = "";
            String[] str = new String[numbers.length];
            for(int i=0; i<numbers.length; i++){
                str[i] = String.valueOf(numbers[i]);
            }
            System.out.println(Arrays.toString(str));// [3, 30, 34, 5, 9]
            Arrays.sort(str, new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    return (o2+o1).compareTo(o1+o2);
                }
            });
            System.out.println(Arrays.toString(str));//  [9, 5, 34, 30, 3] // [9, 5, 34, 3, 30]

            return answer;
        }//solution end
    }
}

'알고리즘 > 알고리즘 개념 정리' 카테고리의 다른 글

[java] Math 클래스, String  (0) 2021.09.27
[java] stream  (0) 2021.09.27
[java] Array, List, Set, Map  (0) 2021.09.26
[java] 형 변환  (0) 2021.09.25
[java] 입력 Scanner BufferedReader 비교  (0) 2021.09.25