java에서 List 객체 정렬 공통 방법
데이터베이스에서 찾아낸 목록list에서는 종종 서로 다른 필드를 다시 정렬해야 한다. 일반적인 방법은 정렬된 필드를 사용하여 데이터베이스에 다시 조회하는 것이다.데이터베이스 조회가 되지 않으면 처음 찾아낸list에서 정렬하면 시스템의 성능을 향상시킬 수 있다.
처음 찾아낸 결과를session에 저장하면list를 다시 정렬할 수 있습니다.일반적으로list 정렬은 Collections를 사용할 수 있습니다.sort (list), 그러나list에 하나의 대상이 포함되어 있다면, 이런 방법은 통하지 않습니다.그럼 어떻게 정렬해야 되지?UserInfo 객체가 있는 경우 다음과 같은 필드가 있습니다.
private java.lang.Integer userId;
private java.lang.String username;
private java.util.Date birthDate;
private java.lang.Integer age;
그러면 이제 userId를 정렬하려면 다음 방법을 사용할 수 있습니다.
Collections.sort(list, new Comparator() {
public int compare(Object a, Object b) {
int one = ((Order)a).getUserId ();
int two = ((Order)b).getUserId ();
return one- two ;
}
});
이렇게 해서 UserInfo 목록의 각 필드를 정렬하려면 각 필드마다 위와 같은 코드를 써야 합니까?그것은 당연히 우리가 필요로 하는 결과가 아니다.프로그램을 쓸 때는 갈수록 세련되게 써야 하며, 쓸수록 쓸데없이 쓸 수는 없다.통용되는 방법을 써 주시겠어요?답은 긍정적이지만 우선 다음 세 가지 문제를 해결해야 한다.1. 범용 사용 가능;
2. 일반적인 비교 방법, 예를 들어compareTo를 사용할 수 있다.
3. 범형, 범형 방법과 같은 범법이 있습니까?
첫 번째 문제는 해결할 수 있고 두 번째 문제는 난이도가 크지 않다. 왜냐하면 자바의 모든 유형은 Object에 계승되고 ToString 방법이 있기 때문이다. 당분간 모든 유형을 String으로 전환한 다음compareTo로 비교할 수 있다.세 번째 문제는 일전에 우리가 필요로 하는 일반적인 방법이 없었다.그러나 getMethod와 invoke 방법으로 동적 추출 방법을 사용할 수 있습니까?완성 코드는 다음과 같습니다.
public class SortList<E>{
public void Sort(List<E> list, final String method, final String sort){
Collections.sort(list, new Comparator() {
public int compare(Object a, Object b) {
int ret = 0;
try{
Method m1 = ((E)a).getClass().getMethod(method, null);
Method m2 = ((E)b).getClass().getMethod(method, null);
if(sort != null && "desc".equals(sort))//
ret = m2.invoke(((E)b), null).toString().compareTo(m1.invoke(((E)a), null).toString());
else//
ret = m1.invoke(((E)a), null).toString().compareTo(m2.invoke(((E)b), null).toString());
}catch(NoSuchMethodException ne){
System.out.println(ne);
}catch(IllegalAccessException ie){
System.out.println(ie);
}catch(InvocationTargetException it){
System.out.println(it);
}
return ret;
}
});
}
}
위의 코드를 봐라, 우리가 위의 세 가지 문제를 성공적으로 해결하였으며, 또한 정거꾸로 순서를 추가했는가.코드에 구체적인 대상과 유형이 사용되지 않아 통용성이 있습니다. 우리는 범용 E를 사용했습니다. UserInfo의 userId를 정렬하려면 방법명을 문자열 형식으로 매개 변수로 전달할 수 있습니다. 예를 들어 "getUserId"입니다.다음 코드를 사용하여 테스트할 수 있습니다.
//Test.java
package test;
import java.util.ArrayList;
import java.util.List;
import java.text.SimpleDateFormat;
public class Test {
public static void main(String[] args)throws Exception{
List<UserInfo> list = new ArrayList<UserInfo>();
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
list.add(new UserInfo(3,"b",formater.parse("1980-12-01"),11));
list.add(new UserInfo(1,"c",formater.parse("1980-10-01"),30));
list.add(new UserInfo(2,"a",formater.parse("1973-10-01"),11));
System.out.println("------- -------------------");
for(UserInfo user : list){
System.out.println(user.toString());
}
//
SortList<UserInfo> sortList = new SortList<UserInfo>();
// userId
sortList.Sort(list, "getUserId", "desc");
System.out.println("-------- userId ------------------");
for(UserInfo user : list){
System.out.println(user.toString());
}
// username
sortList.Sort(list, "getUsername", null);
System.out.println("--------- username -----------------");
for(UserInfo user : list){
System.out.println(user.toString());
}
// birthDate
sortList.Sort(list, "getBirthDatestr", null);
System.out.println("--------- birthDate -----------------");
for(UserInfo user : list){
System.out.println(user.toString());
}
}
}
테스트 결과는 다음과 같습니다.
------- -------------------
3; b; 1980-12-01; 11
1; c; 1980-10-01; 30
2; a; 1973-10-01; 11
-------- userId ------------------
3; b; 1980-12-01; 11
2; a; 1973-10-01; 11
1; c; 1980-10-01; 30
--------- username -----------------
2; a; 1973-10-01; 11
3; b; 1980-12-01; 11
1; c; 1980-10-01; 30
--------- birthDate -----------------
2; a; 1973-10-01; 11
1; c; 1980-10-01; 30
3; b; 1980-12-01; 11
주의: 날짜의 정렬은 형식 변환을 통해 정렬됩니다. 그렇지 않으면 정확한 결과가 나올 수 없습니다.본고에서 기술한 것이 여러분의 자바 프로그램 설계에 도움이 되기를 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.