Arrays.sort: 한글 문자 가나다순으로, 숫자를 크기 순으로 정렬(Sorting)
파일명: Foo.java
public class Foo {
public static void main(String args[]) {
// 문자열 배열 정렬 (가나다 순으로 소팅)
String s[] = { "맹구",
"배용준",
"땡칠이",
"장동건",
"강수정",
"송창식",
"황당해",
"고은아"};
Arrays.sort(s);
System.out.println(Arrays.toString(s));
// 결과: [강수정, 고은아, 땡칠이, 맹구, 배용준, 송창식, 장동건, 황당해]
// 숫자 배열 정렬
double num[] = { -1000,
0.07890264912715708,
0.2,
-0.18441624291164838,
0,
123,
-0.1,
-0.1,
1000,
0.4999};
Arrays.sort(num);
System.out.println(Arrays.toString(num));
// 결과: [-1000.0, -0.18441624291164838, -0.1, -0.1, 0.0, 0.07890264912715708, 0.2, 0.4999, 123.0, 1000.0]
}
}
정수와 실수를 섞어 넣으면, 정수도 double형 실수로 변환되어 출력됩니다.
영문 문자열 배열을 소팅할 때에는 기본적으로 대소문자를 구분하기에, 부자연스러운 결과가 나오게 됩니다. 대소문자 구분없이 소팅하는 방법입니다.
영문 알파벳 문자 배열, 대소문자 구분 없이 소트 예제
파일명: Foo.java
public class Foo {
public static void main(String[] args) {
String[] s = { "bbb", "AAA", "DDD", "CCC", "aaa" };
// 대소문자 구분하여 정렬
Arrays.sort(s);
System.out.println(Arrays.toString(s));
// 결과: [AAA, CCC, DDD, aaa, bbb]
// 대소문자 구분 없이 정렬
Arrays.sort(s, String.CASE_INSENSITIVE_ORDER);
System.out.println(Arrays.toString(s));
// 결과: [AAA, aaa, bbb, CCC, DDD]
}
}
출처 - http://mwultong.blogspot.com/2006/12/java-sort-ignore-case-string-array.html
물론, 오름차순으로 소팅한 후, 그 배열의 순서를 뒤집어주면 역순 정렬이 됩니다. 이 방법의 속도가 느린 줄 알았는데, 비교 함수를 사용하는 것보다 빠르다고 하더군요. 각 요소를 소트할 때마다 비교 함수를 호출하는 데에 시간이 많이 걸리지만, 배열 요소 순서를 단순히 뒤집어 주는 것에는 시간이 거의 걸리지 않기 때문일 것입니다.
그래서 뒤집어 주는 방법으로 예제를 만들었습니다.
문자 배열 내림차순 정렬(Sorting) 예제
파일명: Foo.java
public class Foo {
public static void main(String[] args) {
String[] a = { "bbb", "AAA", "DDD", "똠방각하", "CCC", "aaa" };
Arrays.sort(a, String.CASE_INSENSITIVE_ORDER);
//////////////////////////////////////////////////
// 배열을 리스트로 변환
List<String> list = Arrays.asList(a);
// 리스트 뒤집어 주기
Collections.reverse(list);
//////////////////////////////////////////////////
// 리스트를 배열로 다시 변환
a = list.toArray(new String[list.size()]);
// 순서 뒤집어진 배열을 문자열로 변환 후 출력
String s = Arrays.toString(a);
System.out.println(s);
// 출력 결과: [똠방각하, DDD, CCC, bbb, aaa, AAA]
}
}
출처 - http://mwultong.blogspot.com/2006/12/java-sort-descending-order-string.html
int 배열을 Arrays.sort()를 사용하여 우선 오름차순으로 정렬한 후, reverseArrayInt() 메서드(함수)로, 순서를 거꾸로 뒤집어 주면, 내림차순으로 정렬된 결과를 얻을 수 있습니다.
정수 배열 내림차순 정렬 예제
파일명: Foo.java
public class Foo {
public static void main(String[] args) {
int[] i = { -1, 0, 299, 2, 956, 0, 9, -900 };
// 정렬
Arrays.sort(i);
// 배열 순서 거꾸로
reverseArrayInt(i);
// 순서 뒤집어진 정수 배열을 문자열로 변환 후 출력
System.out.println(Arrays.toString(i));
// 출력 결과: [956, 299, 9, 2, 0, 0, -1, -900]
}
public static void reverseArrayInt(int[] array) {
int temp;
for (int i = 0; i < array.length / 2; i++) {
temp = array[i];
array[i] = array[(array.length - 1) - i];
array[(array.length - 1) - i] = temp;
}
}
}
출처 - http://mwultong.blogspot.com/2006/12/java-int-sort-descending-order-int.html
List<Fruit> fruits= new ArrayList<Fruit>();
Fruit fruit;
for(int i=0;i<100;i++)
{
fruit = new fruit();
fruit.setname(...);
fruits.add(fruit);
}
//Sorting
Collections.sort(fruits, new Comparator<Fruit>() {
@Override
public int compare(Fruit fruite1, Fruit fruite2)
{
return fruite1.fruitName.compareTo(fruite2.fruitName);
}
});
source - http://stackoverflow.com/questions/18441846/how-sort-a-arraylist-in-java
java에서 List정렬에 대해 알아보도록 하겠습니다.
Collections.sort를 사용하면 쉽게 정렬할수 있습니다.
Collections이기때문에 Collection을 implements 하는 List, Map, Vector등을 정렬할 수 있습니다.
정렬 하기 위해서는 Comparator을 implements해서 사용하면 됩니다.
예제를 보고 잘 따라해보세요.
먼저 이름, 주소, 전화번호를 갖고 있는 오브젝트를 만듭니다.
public class User { private String name; private String address; private String phone; public User() { } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this.name = name; } /** * @return the address */ public String getAddress() { return address; } /** * @param address the address to set */ public void setAddress(String address) { this.address = address; } /** * @return the phone */ public String getPhone() { return phone; } /** * @param phone the phone to set */ public void setPhone(String phone) { this.phone = phone; } @Override public String toString() { // TODO Auto-generated method stub StringBuilder str = new StringBuilder(); str.append("name=").append(name).append(", "); str.append("address=").append(address).append(", "); str.append("phone=").append(phone); return str.toString(); } }
그다음은 메인 소스입니다.
[샘플소스]
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class JavaCompareTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub List<User> users = getCreateUsers(); System.out.println("===== 정렬 하기전 ====="); for (User temp : users) { System.out.println(temp); } Collections.sort(users, new NameAscCompare()); System.out.printf("\n\n===== 오름 차순 정렬 =====\n"); for (User temp : users) { System.out.println(temp); } Collections.sort(users, new NameDescCompare()); System.out.printf("\n\n===== 내림 차순 정렬 =====\n"); for (User temp : users) { System.out.println(temp); } } /** * User Data Create * @return */ private static List<User> getCreateUsers() { // TODO Auto-generated method stub List<User> users = new ArrayList<User>(); User user = new User(); user.setName("고철수"); user.setAddress("경기도 성남시 분당구"); user.setPhone("010-1234-0192"); users.add(user); user = new User(); user.setName("박영희"); user.setAddress("부산 해운대"); user.setPhone("010-4234-0192"); users.add(user); user = new User(); user.setName("감수왕"); user.setAddress("충북 제천"); user.setPhone("010-7234-0192"); users.add(user); user = new User(); user.setName("이사람"); user.setAddress("강원도 영울"); user.setPhone("010-0234-0192"); users.add(user); return users; } /** * 이름 오름차순 * @author falbb * */ static class NameAscCompare implements Comparator<User> { /** * 오름차순(ASC) */ @Override public int compare(User arg0, User arg1) { // TODO Auto-generated method stub return arg0.getName().compareTo(arg1.getName()); } } /** * 이름 내림차순 * @author falbb * */ static class NameDescCompare implements Comparator<User> { /** * 내림차순(DESC) */ @Override public int compare(User arg0, User arg1) { // TODO Auto-generated method stub return arg1.getName().compareTo(arg0.getName()); } } }
[실행 결과]
어렵지 않죠!!
몰라서 어려운거지 알면 어렵지 않아요.(당연할 말이 겠지만....^^;)
다음시간에는 숫자 정렬을 해보겠습니다.
거의 똑같고 몇줄만 틀린데 한꺼번에 올리기엔 너무 길어 질것 같아서...^^;
그럼, 다음 시간을 기대주세요.
감사합니다.
출처 - http://forum.falinux.com/zbxe/index.php?document_srl=572635&mid=lecture_tip
저번시간에 문자열 정렬을 해봤습니다.
이번시간에는 숫자 정렬 하는것을 해보겠습니다.
문자열 정렬 내용: http://forum.falinux.com/zbxe/?document_srl=572635
소스는 조금 추가 했습니다.
추가 한 부분만 설명 하겠습니다.
User이란 오브젝트에는 숫자가 없기 때문에 추가
public class User { private String name; private String address; private String phone; private int no; // 추가 ......
[메인소스]
추가 한 부분만 할까 하다가 전부 올립니다.
헷갈라지 않도록....^^;
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class JavaCompareTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub List<User> users = getCreateUsers(); System.out.println("===== 정렬 하기전 ====="); for (User temp : users) { System.out.println(temp); } Collections.sort(users, new NameAscCompare()); System.out.printf("\n\n===== 문자 오름 차순 정렬 =====\n"); for (User temp : users) { System.out.println(temp); } Collections.sort(users, new NameDescCompare()); System.out.printf("\n\n===== 문자 내림 차순 정렬 =====\n"); for (User temp : users) { System.out.println(temp); } Collections.sort(users, new NoAscCompare()); System.out.printf("\n\n===== 숫자 오름 차순 정렬 =====\n"); for (User temp : users) { System.out.println(temp); } Collections.sort(users, new NoDescCompare()); System.out.printf("\n\n===== 숫자 내림 차순 정렬 =====\n"); for (User temp : users) { System.out.println(temp); } } /** * User Data Create * @return */ private static List<User> getCreateUsers() { // TODO Auto-generated method stub List<User> users = new ArrayList<User>(); User user = new User(); user.setName("고철수"); user.setAddress("경기도 성남시 분당구"); user.setPhone("010-1234-0192"); user.setNo(1); users.add(user); user = new User(); user.setName("박영희"); user.setAddress("부산 해운대"); user.setPhone("010-4234-0192"); user.setNo(2); users.add(user); user = new User(); user.setName("감수왕"); user.setAddress("충북 제천"); user.setPhone("010-7234-0192"); user.setNo(3); users.add(user); user = new User(); user.setName("이사람"); user.setAddress("강원도 영울"); user.setPhone("010-0234-0192"); user.setNo(4); users.add(user); return users; } /** * 이름 오름차순 * @author falbb * */ static class NameAscCompare implements Comparator<User> { /** * 오름차순(ASC) */ @Override public int compare(User arg0, User arg1) { // TODO Auto-generated method stub return arg0.getName().compareTo(arg1.getName()); } } /** * 이름 내림차순 * @author falbb * */ static class NameDescCompare implements Comparator<User> { /** * 내림차순(DESC) */ @Override public int compare(User arg0, User arg1) { // TODO Auto-generated method stub return arg1.getName().compareTo(arg0.getName()); } } /** * No 오름차순 * @author falbb * */ static class NoAscCompare implements Comparator<User> { /** * 오름차순(ASC) */ @Override public int compare(User arg0, User arg1) { // TODO Auto-generated method stub return arg0.getNo() < arg1.getNo() ? -1 : arg0.getNo() > arg1.getNo() ? 1:0; } } /** * No 내림차순 * @author falbb * */ static class NoDescCompare implements Comparator<User> { /** * 내림차순(DESC) */ @Override public int compare(User arg0, User arg1) { // TODO Auto-generated method stub return arg0.getNo() > arg1.getNo() ? -1 : arg0.getNo() < arg1.getNo() ? 1:0; } } }
문자열 비교compareTo처럼 숫자도 비교 해서 결과 값을 -1, 0, 1을 리턴 해주면 됩니다.
-1:작다
0:같다
1:크다
간단하죠? 알면 간단 합니다. ^^
[실행 결과]
실행결과 화면을 보면 잘 정렬되었죠!
정렬을 별로 쓸일이 없지만 정말 아주아주 가끔 필요 할때 활용하세요.
감사합니다.
출처 - http://forum.falinux.com/zbxe/index.php?document_srl=572949&mid=lecture_tip
'Development > Java' 카테고리의 다른 글
java - enum (0) | 2012.11.05 |
---|---|
java - @Override (0) | 2012.11.03 |
java - 클래스 구조 및 헬퍼 클래스(helper class) (0) | 2012.10.30 |
java - File 클래스 (0) | 2012.10.23 |
java - xml 읽고 쓰기 (1) | 2012.10.22 |