반응형

- 선택 정렬

 

-위의 방법은 sort로 오름차순으로 편안하게 정렬

-내림차순의 클래스를 통해 메소드를 따로 만들어서 생성

package util;

public class MyArrays {
	// 선택 정렬(오름차순)
	public static void selectionSortAsc(int [] array) {
		
		for(int i = 0; i < array.length-1; i++) { // i = selection
			for(int k = i+1; k < array.length; k++) { // k = move
				
				if(array[i] > array[k]) {
					// 교환
					int tmp = array[i];
					array[i] = array[k];
					array[k]= tmp;
				}
			}//end-for-k
		}//end-for-i
	}//end-selectionSortAsc
	
	// 선택 정렬(내림차순)
	public static void selectionSortDesc(int [] array) {
		
		for(int i = 0; i < array.length-1; i++) { // i = selection
			for(int k = i+1; k < array.length; k++) { // k = move
				
				if(array[i] < array[k]) {
					// 교환
					int tmp = array[i];
					array[i] = array[k];
					array[k]= tmp;
				}
			}//end-for-k
		}//end-for-i
	}//end-selectionSortAsc
}

 

package mymain;

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

import util.MyArrays;

public class _12_Exam12_정렬 {

	public static void main(String[] args) {

		// Ascending : 오름차순(소->대)
		// Descending : 내림차순 (대 -> 소)
		// Integer [] array = {5, 7, 3, 6 ,9, 8, 1, 2, 4}; // Comparator 때문에 Integer로 객체 타입변환
		// 객체를 정리하려면 기본형 타입보다 훨씬 메모리 사용량이 크다.
		int [] array = {5, 7, 3, 6 ,9, 8, 1, 2, 4};
		Arrays.sort(array);
		System.out.println("---[오름차순]---");
		for(int su : array) {
			System.out.printf("%3d", su);
		}
		System.out.println();
		// 객체만 지원해줘서 배열 자체를 객체 타입으로 변경해야하는 번거로움이 있다. (메모리 사용량도 비효율적)
		// Arrays.sort(array, Comparator.reverseOrder());
		MyArrays.selectionSortDesc(array);
		System.out.println("---[내림차순]---");
		for(int su : array) {
			System.out.printf("%3d", su);
		}
		System.out.println();
		
	}//end-main
}

 

 

- 삽입 정렬

	// 삽입정렬(오름차순) ★ 배열 공부 ★
	public static void insertionSortAsc(int [] array) {
		int k;
		int key;
		for(int i = 1; i < array.length; i++) { // i = key
			key = array[i];
			// key 값이 들어갈 자리를 찾는다
			for(k = i-1; k >= 0; k--) {
				if(array[k] > key) {
					array[k+1] = array[k];
				} else {
					break;
				}//end-for2
			}//end-for1
			array[k+1] = key;
		}//end-insertionSortAsc
	}
	
	// 삽입정렬(내림차순) ★ 배열 공부 ★
	public static void insertionSortDesc(int [] array) {
		int k;
		int key;
		for(int i = 1; i < array.length; i++) { // i = key
			key = array[i];
			// key 값이 들어갈 자리를 찾는다
			for(k = i-1; k >= 0; k--) {
				if(array[k] < key) {
					array[k+1] = array[k];
				} else {
					break;
				}//end-for2
			}//end-for1
			array[k+1] = key;
		}//end-insertionSortAsc
	}

 

 

 

- 버블 소트

// Bubble Sort
public static void bubbleSortAsc(int [] array) {
    for(int i=1; i<array.length; i++) {

        for(int k=0; k<array.length-i; k++) {

            if(array[k] > array[k+1]) {
                int im = array[k];
                array[k] = array[k+1];
                array[k+1] = im;
            }
        }
    }
}

// Bubble Sort
public static void bubbleSortDesc(int [] array) {
    for(int i=1; i<array.length; i++) {

        for(int k=0; k<array.length-i; k++) {

            if(array[k] < array[k+1]) {
                int im = array[k];
                array[k] = array[k+1];
                array[k+1] = im;
            }
        }
    }
}

 

 

객체에 대한 배열

package vo;

public class PersonVo {
	
	// Value Object 값을 저장하고 가져오는 객체
	private final String name;
	private final int age;
	private final String addr;
	
	public PersonVo(String name, int age, String addr) {
		super();
		this.name = name;
		this.age = age;
		this.addr = addr;
	}
	
	@Override
	public String toString() {
		return String.format("[%s-%d-%s]", name, age, addr);
	}
	
	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

	public String getAddr() {
		return addr;
	}
	
}
public class _13_Exam13_객체정렬 {

	public static void main(String[] args) {
		
		PersonVo [] p_array = {
				new PersonVo("길동1", 31, "서울 관악 남부순환로1"),
				new PersonVo("길동4", 25, "서울 관악 남부순환로5"),
				new PersonVo("길동3", 17, "서울 관악 남부순환로4"),
				new PersonVo("길동5", 35, "서울 관악 남부순환로2"),
				new PersonVo("길동2", 40, "서울 관악 남부순환로3")
		};
		System.out.println("---[before sort]---");
		for(PersonVo p : p_array) {
			System.out.println(p);
		}

		// 정렬기준정보를 전달해줘야한다
		Arrays.sort(p_array, new PersonComp());
		
		System.out.println("---[After sort : 나이순 오름차순]---");
		for(PersonVo p : p_array) {
			System.out.println(p);
		}
		
	}//end-main
}
// PersonVo의 정렬에 대한 기준
public class PersonComp implements Comparator<PersonVo>{

	@Override
	public int compare(PersonVo o1, PersonVo o2) {
		int result = 0;
		if(o1.getAge() > o2.getAge()) result = 1;
		else if (o1.getAge() < o2.getAge()) result = -1;
		return result;
	}
}

//Desc
result = -result;

return result;

 

- 이름순으로 정렬(compareTo)

 

@Override
public int compare(PersonVo o1, PersonVo o2) {
    int result = 0;

    if(o1.getName().compareTo(o2.getName()) > 0) result = 1;
    else if(o1.getName().compareTo(o2.getName()) < 0) result = -1;
    
// 주소 오름차순
if(o1.getAddr().compareTo(o2.getAddr()) > 0) result = 1;
else if(o1.getAddr().compareTo(o2.getAddr()) < 0) result = -1;
    
///////////////////////////////////////////////////////////////////
// compareTo 앞에 있는 문자와 뒤에 있는 문자를 비교하겠다.
System.out.println("ABC".compareTo("ABC")); // 결과값 : 0
// 앞의 문자에서 뒤에 문자를 뺀다. 아스키코드 a = 97, A = 65
System.out.println("aBC".compareTo("ABC")); // 결과값 : 32
// AB의 값을 비교했을때는 0이여서 c를 비교한다. 아스키코드 c =99, C = 67
System.out.println("ABC".compareTo("ABc")); // 결과값 : -32
// 0보다 큰 값이 나오면 +, 작으면 -가 나온다.

 

 

최종

package vo;

import java.util.Comparator;

// PersonVo의 정렬에 대한 기준
public class PersonComp implements Comparator<PersonVo>{

	public static final int SORT_FIELD_NAME = 1;
	public static final int SORT_FIELD_AGE = 2;
	public static final int SORT_FIELD_ADDR = 3;

	// 정렬방식(오름차순/내림차순)
	public static final int SORT_METHOD_ASC = 1;
	public static final int SORT_METHOD_DESC = 2;

	int sort_field = SORT_FIELD_NAME;
	int sort_method = SORT_METHOD_ASC;

	public void setSort_field(int sort_field) {
		this.sort_field = sort_field;
	}                                                      
                                                           
	public void setSort_method(int sort_method) {          
		this.sort_method = sort_method;                    
	}

	@Override
	public int compare(PersonVo o1, PersonVo o2) {
		int result = 0;

		if(sort_field == SORT_FIELD_NAME) {
			if(o1.getName().compareTo(o2.getName()) > 0) result = 1;
			else if(o1.getName().compareTo(o2.getName()) < 0) result = -1;
		}else if(sort_field == SORT_FIELD_AGE){
			if(o1.getAge() > o2.getAge()) result = 1;
			else if (o1.getAge() < o2.getAge()) result = -1;
		}else if(sort_field == SORT_FIELD_ADDR){
			if(o1.getAddr().compareTo(o2.getAddr()) > 0) result = 1;
			else if(o1.getAddr().compareTo(o2.getAddr()) < 0) result = -1;
		}

		//Desc
		if(sort_method == SORT_METHOD_DESC)
			result = -result;

		return result;
	}
}

 

 

 

- 내림차순 오름차순 set 메서드는 저장시에 쭉가기 때문에 차순을 변경해서 호출할 때 일일이 같이 호출해주어야 한다.

package mymain;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import vo.PersonComp;
import vo.PersonVo;

public class _14_Exam14_객체정렬_ArrayList {

	public static void main(String[] args) {
		
		List<PersonVo> p_list = new ArrayList<PersonVo>();
		p_list.add(new PersonVo("가길동", 20, "서울 관악 신림2"));
		p_list.add(new PersonVo("나길동", 30, "서울 관악 신림4"));
		p_list.add(new PersonVo("마길동", 40, "서울 관악 신림5"));
		p_list.add(new PersonVo("바길동", 10, "서울 관악 신림3"));
		p_list.add(new PersonVo("다길동", 50, "서울 관악 신림1"));

		System.out.println("---[before sort]---");
		for(PersonVo p : p_list) {
			System.out.println(p);
		}
		
		PersonComp comp = new PersonComp();
		// 정렬기준정보를 전달해줘야한다
		Collections.sort(p_list, comp);
		
		System.out.println("---[이름순 오름차순]---");
		for(PersonVo p : p_list) {
			System.out.println(p);
		}
		
		comp.setSort_method(PersonComp.SORT_METHOD_DESC);
		Collections.sort(p_list, comp);
		System.out.println("---[이름순 내림차순]---");
		for(PersonVo p : p_list) {
			System.out.println(p);
		}
		
		comp.setSort_field(PersonComp.SORT_FIELD_AGE);
		comp.setSort_method(PersonComp.SORT_METHOD_ASC);
		Collections.sort(p_list, comp);
		System.out.println("---[나이순 오름차순]---");
		for(PersonVo p : p_list) {
			System.out.println(p);
		}
		
		comp.setSort_field(PersonComp.SORT_FIELD_AGE);
		comp.setSort_method(PersonComp.SORT_METHOD_DESC);
		Collections.sort(p_list, comp);
		System.out.println("---[나이순 내림차순]---");
		for(PersonVo p : p_list) {
			System.out.println(p);
		}
		comp.setSort_field(PersonComp.SORT_FIELD_ADDR);
		comp.setSort_method(PersonComp.SORT_METHOD_ASC);
		Collections.sort(p_list, comp);
		System.out.println("---[주소순 오름차순]---");
		for(PersonVo p : p_list) {
			System.out.println(p);
		}
		comp.setSort_field(PersonComp.SORT_FIELD_ADDR);
		comp.setSort_method(PersonComp.SORT_METHOD_DESC);
		Collections.sort(p_list, comp);
		System.out.println("---[주소순 내림차순]---");
		for(PersonVo p : p_list) {
			System.out.println(p);
		}
		
	}
}

 

 

-ArrayList 배열 정리

package mymain;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import vo.PersonComp;
import vo.PersonVo;

public class _14_Exam14_객체정렬_ArrayList {

	public static void main(String[] args) {
		
		List<PersonVo> p_list = new ArrayList<PersonVo>();
		p_list.add(new PersonVo("가길동", 20, "서울 관악 신림2"));
		p_list.add(new PersonVo("나길동", 30, "서울 관악 신림4"));
		p_list.add(new PersonVo("마길동", 40, "서울 관악 신림5"));
		p_list.add(new PersonVo("바길동", 10, "서울 관악 신림3"));
		p_list.add(new PersonVo("다길동", 50, "서울 관악 신림1"));

		System.out.println("---[before sort]---");
		for(PersonVo p : p_list) {
			System.out.println(p);
		}
		
		PersonComp comp = new PersonComp();
		// 정렬기준정보를 전달해줘야한다
		Collections.sort(p_list, comp);
		
		System.out.println("---[이름순 오름차순]---");
		for(PersonVo p : p_list) {
			System.out.println(p);
		}
		
		comp.setSort_method(PersonComp.SORT_METHOD_DESC);
		Collections.sort(p_list, comp);
		System.out.println("---[이름순 내림차순]---");
		for(PersonVo p : p_list) {
			System.out.println(p);
		}
		
		comp.setSort_field(PersonComp.SORT_FIELD_AGE);
		Collections.sort(p_list, comp);
		System.out.println("---[나이순 오름차순]---");
		for(PersonVo p : p_list) {
			System.out.println(p);
		}
		
		comp.setSort_field(PersonComp.SORT_FIELD_AGE);
		comp.setSort_method(PersonComp.SORT_METHOD_DESC);
		Collections.sort(p_list, comp);
		System.out.println("---[나이순 내림차순]---");
		for(PersonVo p : p_list) {
			System.out.println(p);
		}
		comp.setSort_field(PersonComp.SORT_FIELD_ADDR);
		Collections.sort(p_list, comp);
		System.out.println("---[주소순 오름차순]---");
		for(PersonVo p : p_list) {
			System.out.println(p);
		}
		comp.setSort_field(PersonComp.SORT_FIELD_ADDR);
		comp.setSort_method(PersonComp.SORT_METHOD_DESC);
		Collections.sort(p_list, comp);
		System.out.println("---[주소순 내림차순]---");
		for(PersonVo p : p_list) {
			System.out.println(p);
		}
		
	}
}

 

 

 

-점수 구하기 예제

package vo;

public class Grade {

	String name;
	int kor;
	int eng;
	int math;
	int total;
	
	public Grade() {
	}
	
	public Grade(String name, int kor, int eng, int math) {
		super();
		this.name = name;
		this.kor = kor;
		this.eng = eng;
		this.math = math;
	}
	
	@Override
	public String toString() {
		return String.format("[%s- 국어 : %d 영어 : %d 수학 : %d 총점: %d]", name, kor, eng, math, (kor+eng+math));
	}
	// 값이 바뀌든 안바뀌든 어차피 필드 3개의 값은 같기 때문에 토탈은 get으로만 받는다.
	public int getTotal() {
		return (kor+eng+math);
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setKor(int kor) {
		this.kor = kor;
	}

	public String getName() {
		return name;
	}

	public int getKor() {
		return kor;
	}

	public int getEng() {
		return eng;
	}

	public int getMath() {
		return math;
	}

	public void setEng(int eng) {
		this.eng = eng;
	}

	public void setMath(int math) {
		this.math = math;
	}
}
package util;

import java.util.Comparator;

import vo.Grade;
import vo.PersonVo;

public class GradeComp implements Comparator<Grade>{

	public static final int SORT_FIELD_NAME = 1;
	public static final int SORT_FIELD_KOR = 2;
	public static final int SORT_FIELD_ENG = 3;
	public static final int SORT_FIELD_MATH = 4;
	public static final int SORT_FIELD_ALL = 5;

	public static final int SORT_METHOD_ASC = 1;
	public static final int SORT_METHOD_DESC = 2;

	int sort_field = SORT_FIELD_NAME;
	int sort_method = SORT_METHOD_ASC;

	public void setSort_field(int sort_field) {
		this.sort_field = sort_field;
	}

	public void setSort_method(int sort_method) {
		this.sort_method = sort_method;
	}

	@Override
	public int compare(Grade o1, Grade o2) {
		int result = 0;

		if(sort_field == SORT_FIELD_NAME) {
			if(o1.getName().compareTo(o2.getName()) > 0) result = 1;
			else if(o1.getName().compareTo(o2.getName()) < 0) result = -1;

		}else if(sort_field == SORT_FIELD_KOR) {
			if(o1.getKor() > o2.getKor()) result = 1;
			else if(o1.getKor() < o2.getKor()) result = -1;

		}else if(sort_field == SORT_FIELD_ENG) {
			if(o1.getEng() > o2.getEng()) result = 1;
			else if(o1.getEng() < o2.getEng()) result = -1;

		}else if(sort_field == SORT_FIELD_MATH) {
			if(o1.getMath() > o2.getMath()) result = 1;
			else if(o1.getMath() < o2.getMath()) result = -1;

		} else if(sort_field == SORT_FIELD_ALL) {
			if(o1.getTotal() > o2.getTotal()) result = 1;
			else if(o1.getTotal() < o2.getTotal()) result = -1;
		}
		
			if(sort_method == SORT_METHOD_DESC)
				result = -result;

			return result;
		}

	}
package mymain;

import java.util.Arrays;

import util.GradeComp;
import vo.Grade;

public class _15_Exam15_객체정렬_성적 {

	public static void main(String[] args) {

		Grade [] grade_array = {
				new Grade("다둥이", 15, 80, 85),
				new Grade("가둥이", 80, 77, 15),
				new Grade("나둥이", 55, 99, 98),
				new Grade("라둥이", 18, 80, 44),
				new Grade("마둥이", 68, 75, 30)
		};
		
		System.out.println("---[원본]---");
		for(Grade g : grade_array) {
			System.out.println(g);
		}
		
		GradeComp comp = new GradeComp();
		Arrays.sort(grade_array, comp);
		
		System.out.println("---[이름순 오름차순]---");
		for(Grade g : grade_array) {
			System.out.println(g);
		}
		
		comp.setSort_method(GradeComp.SORT_METHOD_DESC);
		Arrays.sort(grade_array, comp);
		System.out.println("---[이름순 내림차순]---");
		for(Grade g : grade_array) {
			System.out.println(g);
		}
		
		comp.setSort_method(GradeComp.SORT_METHOD_ASC);
		comp.setSort_field(GradeComp.SORT_FIELD_KOR);
		Arrays.sort(grade_array, comp);
		System.out.println("---[국어점수 오름차순]---");
		for(Grade g : grade_array) {
			System.out.println(g);
		}
		comp.setSort_method(GradeComp.SORT_METHOD_DESC);
		comp.setSort_field(GradeComp.SORT_FIELD_KOR);
		Arrays.sort(grade_array, comp);
		System.out.println("---[국어점수 내림차순]---");
		for(Grade g : grade_array) {
			System.out.println(g);
		}
		comp.setSort_method(GradeComp.SORT_METHOD_ASC);
		comp.setSort_field(GradeComp.SORT_FIELD_ENG);
		Arrays.sort(grade_array, comp);
		System.out.println("---[영어점수 오름차순]---");
		for(Grade g : grade_array) {
			System.out.println(g);
		}
		comp.setSort_method(GradeComp.SORT_METHOD_DESC);
		comp.setSort_field(GradeComp.SORT_FIELD_ENG);
		Arrays.sort(grade_array, comp);
		System.out.println("---[영어점수 내림차순]---");
		for(Grade g : grade_array) {
			System.out.println(g);
		}
		comp.setSort_method(GradeComp.SORT_METHOD_ASC);
		comp.setSort_field(GradeComp.SORT_FIELD_MATH);
		Arrays.sort(grade_array, comp);
		System.out.println("---[수학점수 오름차순]---");
		for(Grade g : grade_array) {
			System.out.println(g);
		}
		comp.setSort_method(GradeComp.SORT_METHOD_DESC);
		comp.setSort_field(GradeComp.SORT_FIELD_MATH);
		Arrays.sort(grade_array, comp);
		System.out.println("---[수학점수 내림차순]---");
		for(Grade g : grade_array) {
			System.out.println(g);
		}
		
	}//end-main
}

 

 

 

-임의의 구간만 숫자 배열을 변경한 뒤 내림차순으로 정리하는 방법

package mymain;

import java.util.Arrays;

import util.MyArrays;

public class _16_Exam16_정렬_Overload {

	public static void main(String[] args) {

		int [] arr = {5, 4, 3, 1, 2, 9, 8, 7,6};
		
		System.out.println("---[sorted]---");
		//Arrays.sort(arr);
		MyArrays.insertionSortDesc(arr);
		for(int n : arr) {
			System.out.printf("%3d", n);
		}
		System.out.println();
		
		System.out.println("---[sort(arr, 2, 6)]---");
		Arrays.sort(arr, 2, 6);
		for(int n : arr) {
			System.out.printf("%3d", n);
		}
		System.out.println();
		
		// selectionSortDesc 방법
//		System.out.println("---[sort(arr, 2, 6)]---");
//		MyArrays.selectionSortDesc(arr, 2, 6);
//		for(int n : arr) {
//			System.out.printf("%3d", n);
//		}
//		System.out.println();
		
		// insertionSortDesc 방법
//		System.out.println("---[sort(arr, 2, 6)]---");
//		MyArrays.insertionSortDesc(arr, 2, 6);
//		for(int n : arr) {
//			System.out.printf("%3d", n);
//		}
		
		// bubbleSortDesc 방법
		System.out.println("---[sort(arr, 2, 6)]---");
		MyArrays.bubbleSortDesc(arr, 2, 6);
		for(int n : arr) {
			System.out.printf("%3d", n);
		}

	}//end-main
}
public static void selectionSortDesc(int [] array, int beginIndex, int toIndex) {

    for(int i = beginIndex; i < toIndex-1; i++) { // i = selection
        for(int k = i+1; k < toIndex; k++) { // k = move

            if(array[i] < array[k]) {
                // 교환
                int tmp = array[i];
                array[i] = array[k];
                array[k]= tmp;
            }
        }//end-for-k
    }//end-for-i
}//end-selectionSortAsc


public static void insertionSortDesc(int [] array,  int beginIndex, int toIndex) {
    int k;
    int key; // i = 1~8
    for(int i = beginIndex+1; i < toIndex; i++) { // i = key
        key = array[i];
        // key 값이 들어갈 자리를 찾는다
        for(k = i-1; k >= 0; k--) {
            if(array[k] < key) {
                array[k+1] = array[k];
            } else {
                break;
            }//end-for2
        }//end-for1
        array[k+1] = key;
    }//end-insertionSortAsc
}

public static void bubbleSortDesc(int [] array, int beginIndex, int toIndex) {
    for(int i=beginIndex-1; i<toIndex; i++) {

        for(int k=i-1; k<toIndex-i; k++) {

            if(array[k] < array[k+1]) {
                int im = array[k];
                array[k] = array[k+1];
                array[k+1] = im;
            }
        }
    }
}


}
반응형