2010-05-13 2 views
4

나는 어디서부터 시작해야할지 정말 모른다는 질문이 있습니다. 그래서 내가 여기서 물어볼 줄 알았다.알파벳 순서로 객체의 자바 컬렉션 얻기

기본적으로 이름이 드롭 다운되어 있습니다. 나는이 이름들을 알파벳순으로 원한다.

드롭 다운을 채우는 과정은 다음과 같습니다.

데이터베이스를 쿼리하고 Id와 Name을 풀다가 "UserList"라는 개체를 만들고 이름과 ID 변수를 내가 가진 것으로 설정합니다. 다음이 개체를 ArrayList에 추가합니다. 나는 이것을 계속해서 반복한다.

나는 다음 배열이 컬렉션을 변환하고 난 다음 아래 드롭 다운을 채울

session.setAttribute("userList", UserList); 

사용하여 내 JSP 페이지로 전달합니다.

<c:forEach items="${userList}" var="c" > 
`<html-el:option value="${c.id}"><c:out value="${c.name}"/></html-el:option> </c:forEach> 

아마도 간단한 답변이지만이 이름을 정렬하는 방법은 있을까요?

+1

일 튜토리얼 가져올 수 : http://java.sun.com/docs/books/tutorial/collections/interfaces/order.html 관련 질문 : http://stackoverflow.com/를 질문/1814095/sorting-an-arraylist of contacts – BalusC

답변

3

마이클, 당신은이 조인을 사용해야하며 의해 순서는 데이터베이스에서 데이터를 얻을 수 (위의 구문은 완벽하지 않을 수 있으며, MySQL은 약간 녹슬다.)

+0

솔직히 말해서 내부 결합이라는 개념을 놓친 이유는 모르겠다. 이 스키마는 내가 뛰어 내린 스키마이고 아마도 그 이유입니다. 하지만 그게 훨씬 깨끗 하 고 쉽게 그래서 나를 보여 주셔서 감사합니다! 내가 다음을했다 회사에서 company.id, company.name를 선택 INNER JOIN user_company ON company_id = user_company.CompanyId WHERE user_company.UserId = 'UserIDVariable'ORDER BY name; – MichaelMcCabe

0

UserList의 compareTo 메서드를 재정의하여 일부 문자열 값에 따라 알파벳순으로 요소를 비교할 수 있습니다. 그런 다음 배열 목록의 sort 메소드를 호출하고 compareTo를 사용하여 정렬해야합니다.

8

당신은 일반적으로 (그들은 Strings을 경우 다음이 이미 구현 것) 매개 변수로 ArrayListpublic static Collections.sort(List<T> list)를 호출하여 그것을 할,하지만 Comparable 인터페이스를 구현하는데주의를 기울여야 또는 작동하지 않습니다 :

Collections.sort(yourList); 

마지막으로

public class User implements Comparable<User> { 
    public int compareTo(User other) { 
     return userName.compareTo(other.userName); 
    } 
} 

NOO 경우 : 사용자 정의 클래스를 가지고 있지만 당신은 그냥 문자열 필드 위에 정렬 할 그렇지 않은 경우는 compareTo 방법을 위임 할 수 있습니다 내부 네 자신의 compareTo 메서드를 롤백하는 경우 호출 객체가 전달 된 객체보다 작거나 같거나 크면 -1, 0 또는 1을 반환해야합니다.

+0

Collections.sort가 string 유형의 객체를 포함하는 arrayList와 함께 작동하지 않는다고 가정 할 때 사용자 정의 클래스를 계속 사용합니다. – MichaelMcCabe

+0

@Michael : it * * IS **는 이미 맞춤 클래스입니다. 적어도 "id"와 "name"속성을 가지고 있습니다;)이 코드는 모두 여러분의 코드입니까 아니면 기존 프로젝트를 유지해야합니까? – BalusC

+0

기존 프로젝트를 확장하는 중 ... 아마도 다음과 같이 말할 수 있습니다. P exsiting 클래스에서 Comparable을 구현한다는 의미는 알지 못했습니다. 나는이 목적을 배우기 위해 노력하고 있지만이 특별한 문제에 대해서는 위에 언급 한 바와 같이 DB 쿼리에서 할 것입니다. – MichaelMcCabe

0

당신은 Collections.sort를 사용하고

  1. 중 하나 귀하의 사용자 클래스는 Comparable 인터페이스
  2. 을 구현합니다 UserListComparator 구현 Comparator<UserList> 인터페이스

만들기 자세한 내용은 Comparable 인터페이스 설명서를 참조해야한다.

1

이 문제의 가장 이상적인 해결책은 데이터베이스 쿼리 수준에서 정렬하는 것입니다. 테이블의 색인이 잘 잡히면 가장 빠른 방법이며 가장 좋은 방법이라고 할 수 있습니다.

그런데, 그 목록을 정렬하고 데이터베이스 측에서 시작하지 않으려면 컬렉션을 사용하십시오.정렬 및 사용자 목록 구현 Comparable<UserList>

대소 문자를 구분하지 않는 문자열 비교를 사용하면 사용자가 정렬 결과를 이해하지 못할 수 있습니다.

1

데이터베이스 쿼리를 변경하여 원하는 순서로 행을 반환합니다.

SQL을 사용하는 경우 쿼리는 다음과 같을 수 있습니다.

SELECT Id, Name FROM Person ORDER BY Name; 

이것은 코드에서 수행하는 것보다 몇 가지 장점이 있습니다.

  • 더 빠릅니다.
  • 코드를 변경할 필요가 없습니다.
  • 작업이 적습니다.

    select person.id, person.name from person inner join person_company using(personid) 
    order by person.name; 
    

    을 그리고 정렬하고 자바에서이 작업을 수행하려고하지 :하지 검색하고 자바 정렬,

+0

내가 쿼리하는 방식으로이 wouldnt 작품 (내가 틀렸다면 용서해주십시오). 내 쿼리에서 사용중인 정수 배열을 반복합니다. 즉 SELECT ID, NAME FROM Person where id = ' "+ variable +"'; 모든 쿼리를 만들면 ArrayList에 개체를 추가합니다. – MichaelMcCabe

+0

그래서 ORDER BY는 쿼리 당 하나의 레코드 만 반환되기 때문에 무의미합니다. – MichaelMcCabe

+1

@Michael, 데이터베이스를 쿼리하는 끔찍한 방법입니다. 평범하지 않은 양의 기록은 매우 느릴 것입니다. 대신에 다음을 사용하십시오 : id를 선택하고, 사람의 이름을 (변수, 변수, 변수) id로 정렬하십시오. 그리고 이드의이 목록을 어디에서 얻고 있습니까? 데이터베이스의 경우 데이터베이스에서 모두 한 번에 쿼리해야합니다. – Yishai

0

대신

select Id, Name from Person where id = '+variable+'; 

당신은 변수를 통해 루프 및 쉼표로 구분 된 목록을 작성,이 방법은 단일 쿼리

int[] variableList = wherever_you_get_it_from; 
StringBuffer csv = new StringBuffer(); 
for (int i = 0; i < variableList.length; i++) { 
    csv.append(variableList[i]); 
    if (i < variableList.length - 1) 
     csv.append(","); 
} 
에게 해고 할 수와 많은 쿼리를 발사의 데이터베이스으로 정렬 할 수 당신이 회사 테이블에서 사용자 ID를 받고 있기 때문에

당신은,

select Id, Name from Person where id in (+csv.toString()+) order by Name; 

을 제공 가입

select u.usrid, u.name from company c left join user u on c.usrid = u.usrid 
    where c.companyid in (comapnyid1, companyid2, companyid3) order by u.name; 
객체 순서에