2014-06-11 2 views
0

나는 String 인 객체 값을 가진 List<Bean>을 가지고 있습니다. 이 문자열은 다음과 같습니다. "This is 1", "This is 10", "This is 2", "This is 11"
제 질문은 guava를 사용하여 1, 2, 10, 11? 나는 그것이 1, 10, 11, 2
당신이 좀 도와 주시겠습니까처럼 정렬하려면 같은 자바에서 문자열 정렬

List<Bean> orderedList = new ArrayList<>(); 
    Function<Bean, String> getNameFunction = new Function<Bean, String>() { 
     @Override 
     public String apply(Bean from) { 
      return from.getShape(); 
     } 
    }; 
    Ordering<Bean> nameOrdering = Ordering.natural().onResultOf(getNameFunction); 
    ImmutableSortedSet<Bean> sortedShapes = ImmutableSortedSet.orderedBy(
      nameOrdering).addAll(lb).build(); 
    orderedList.addAll(sortedShapes); 
    return orderedList; 

가 작동하지 않습니다?
감사합니다.

+0

. 이것은 일종의 예상대로 작동 할 수 있도록 표준화 된 방법입니다. – Kon

+0

숫자 대신 문자열을 주문 하시겠습니까? – ra2085

+0

주문 1, 10, 11, 2가 나에게 맞는 것 같습니다. 당신은 현악기를 주문하고 있습니다. – ra2085

답변

1

기본을 JavaStrings에 대한 주문 Strings을 의미 순으로 자신의 구성 요소 문자의 (문자 비교하여 문자를) 정렬하는 lexicographical이다. String.compareTo 문서에서 :

[...] 그들은 (문자열)은 하나 이상의 인덱스의 위치에있는 문자가 다른 경우, 하자 가장 작은 인덱스를 k; 위치 k의 문자가
의 더 작은 값을 갖는 문자열은 < 연산자를 사용하여 결정된 것처럼 사전 식으로 이 다른 문자열보다 우선합니다.

ColinD 당신이 Strings의 숫자 정렬을 지원하는 Comparator의 구현이 필요합니다 있듯이. 다음은 예입니다

List<Bean> lb = new ArrayList<Bean>() {{ 
      add(new Bean("This is 1")); 
      add(new Bean("This is 10")); 
      add(new Bean("This is 11")); 
      add(new Bean("This is 2")); 
     }}; 
    final AlphaNumericComparator comparator= new AlphaNumericComparator(); 
    Ordering<Bean> nameOrdering = new Ordering<Bean>() { 
     @Override public int compare(Bean left, Bean right) { 
      return comparator.compare(left.getShape(),right.getShape()); 
     } 
    }; 
    ImmutableSortedSet<Bean> sortedShapes = ImmutableSortedSet.orderedBy(nameOrdering).addAll(lb).build(); 
    List<Bean> orderedList = new ArrayList<>(); 
    orderedList.addAll(sortedShapes); 
    System.out.println("orderedList:" + orderedList); 

AlphaNumericComparator (피에르 - 뤽 Paour에 의해) : 나는 구아바에 대해 많이 알고 있지만, 자신의`Comparator` 구현을 작성에 읽을하지 않는

public class AlphaNumericComparator implements Comparator { 
    int compareRight(String a, String b) { 
     int bias = 0; 
     int ia = 0; 
     int ib = 0; 
     for (; ; ia++, ib++) { 
      char ca = charAt(a, ia); 
      char cb = charAt(b, ib); 
      if (!Character.isDigit(ca) && !Character.isDigit(cb)) 
       return bias; 
      else if (!Character.isDigit(ca)) 
       return -1; 
      else if (!Character.isDigit(cb)) 
       return +1; 
      else if (ca < cb) 
       if (bias == 0) 
        bias = -1; 
       else if (ca > cb) 
        if (bias == 0) 
         bias = +1; 
        else if (ca == 0 && cb == 0) 
         return bias; 
     } 
    } 

    public int compare(Object o1, Object o2) { 
     String a = o1.toString(); 
     String b = o2.toString(); 
     int ia = 0, ib = 0; 
     int nza = 0, nzb = 0; 
     char ca, cb; 
     int result; 

     while (true) { 
      nza = nzb = 0; 
      ca = charAt(a, ia); 
      cb = charAt(b, ib); 
      while (Character.isSpaceChar(ca) || ca == '0') { 
       if (ca == '0') 
        nza++; 
       else 
        nza = 0; 
       ca = charAt(a, ++ia); 
      } 

      while (Character.isSpaceChar(cb) || cb == '0') { 
       if (cb == '0') 
        nzb++; 
       else 
        nzb = 0; 
       cb = charAt(b, ++ib); 
      } 
      if (Character.isDigit(ca) && Character.isDigit(cb)) 
       if ((result = compareRight(a.substring(ia), b.substring(ib))) != 0) 
        return result; 

      if (ca == 0 && cb == 0) 
       return nza - nzb; 
      if (ca < cb) 
       return -1; 
      else if (ca > cb) 
       return +1; 
      ++ia; 
      ++ib; 
     } 
    } 

    static char charAt(String s, int i) { 
     if (i >= s.length()) { 
      return 0; 
     } else 
      return s.charAt(i); 
    } 
} 
+0

대단히 고마워요 :) 예상대로 작동합니다 :) – Pentarex

2

Java에서 String의 자연 순서는 사전 식입니다. 원하는 것을 수행하는 Comparator 구현을 작성하거나 찾아야합니다. 직접 작성하는 경우 Ordering 하위 클래스를 대신 작성할 수 있습니다. 그럼 당신은 다만 할 수 있습니다 (자연)

Ordering<Bean> nameOrdering = myStringOrdering.onResultOf(getNameFunction);