반응형
- 선택 정렬
-위의 방법은 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;
}
}
}
}
}
반응형