2014-02-10 2 views
0

사용자 지정 순서에 따라 목록을 정렬하려고하는데 이미 stackOverflow 링크를 따라갔습니다. 커스텀 오더는 customOrder에서 배열리스트로 처리 된 "ST, SIT, JDC"와 같아야합니다. 위의 순서대로 목록에 데이터베이스에서 가져온 데이터를 표시해야하지만 정확히 "ST"라는 단어가있는 경우와 같이 데이터베이스의 데이터가이 목록과 정확히 일치하는 경우에만 문제가 발생합니다. 또는 "SIT"를 선택하면 작업을 수행합니다. 는하지만 데이터베이스에서 무엇입니까 데이터는 다음과 같습니다사용자 지정 순서에 따라 Java 목록을 정렬하는 방법

ST1, ST2, ST3, SIT1, SIT2, JDC 출시, JDC 정지, JDC 10

이 코드 나던 작업을 내 데이터의 경우 결과에 오류가 없지만 데이터를 전혀 정렬하지 않습니다. 당신이 customOrder 목록에있는 모든 가능성을 정의하지 않는 것이,

List<Environment> environments = environmentDAO.getAll(); 
final List<String> customOrder = Arrays.asList("ST", "SIT", "JDC"); 

    Collections.sort(environments, new Comparator<Environment>() { 

     @Override 
     public int compare(final Environment o1, final Environment o2) { 

      Integer firstValue = Integer.valueOf(customOrder.indexOf(o1.getAcronym())); 
      Integer secondValue = Integer.valueOf(customOrder.indexOf(o2.getAcronym())); 

      int comparedTo = firstValue.compareTo(secondValue); 

      return comparedTo; 
     } 
    }); 
+1

귀하의 설명이 꽤 불분명 한 것 같습니다. 샘플 데이터를 제공하고 이미 정렬 된 것처럼 보이게하는 방법. –

+0

** 사용자 정의 정렬 순서는 무엇입니까 **? 예상 결과를 게시하십시오. ** ** 모든'collection '은 올바른'Comporator'를 제공하는 한'Collections.sort()'로 정렬 될 수 있습니다. –

+0

나에게 좋아 보인다. 정확히 작동하지 않는 것은 무엇입니까? 예외를 던지고 있습니까? 주문이 취소 되었습니까? – NeplatnyUdaj

답변

1

문제는 여기

는 코드입니다.

List.indexOf -1을 돌려줍니다 발견하고 경우에 모든 것을, 그래서 아무것도

그래서 당신이 customOrder이 접두사의 목록입니다 있다고 가정하는 예를 들어 필요 분류되지 도착하지 않는 요소. 너가 원하는게 그거야? 어쨌든

@Override 
    public int compare(final Environment o1, final Environment o2) { 
     int order1=-1; 
     int order2=-1; 
     String remainder1=""; 
     String remainder2=""; 
     for (String prefix: customOrder){ 
      if (o1.getAcronym().startsWith(prefix)){ 
       order1=customOrder.indexOf(prefix); 
       remainder1=o1.getAcronym().substring(prefix.length()); 
      } 
      if (o2.getAcronym().startsWith(prefix)){ 
       order2=customOrder.indexOf(prefix); 
       remainder2=o2.getAcronym().substring(prefix.length()); 
      } 
     } 
     if (order1==order2){ 
      return remainder1.compareTo(remainder2); 
     } 
     else{ 
      return order1-order2; 
     } 
    } 

그러나 등의 접두사를 중복 같은 일부 가장자리 경우가있을 것입니다 :이 경우 , 당신은 첫 경기의 지표를 발견하고도 비교 문자열 모두 같은 접두어가 경우에 나머지를 추적해야합니다 나는이 코드를 시도했고 당신의 데이터에서 작동한다.

+0

을 정확히 업데이트했는데 어떻게해야합니까? – user261002

+0

내 코드를 사용해 보셨습니까? – NeplatnyUdaj

+0

방금 ​​코드를 시험해 보았는데 아름답게 작동했습니다. 많이 고맙습니다. :-) – user261002

관련 문제