2012-12-12 2 views
0

대부분의 제품이 의미가 있지만 이름은 중복되지 않는 제품 크기를 나타내는 문자열 그룹이 있습니다. 크기가 큰 IE에는 적어도 14 가지 철자가 가능하며 각각은 보존해야합니다. 이러한 크기를 기반으로 정렬해야합니다. 가능한 모든 작은 값은 가능한 중간 값 등 앞에 와야합니다.임의의 순서로 문자열 정렬

이 방법이 가능하다는 것을 알 수있는 유일한 방법은 각각의 크기가 나타내는 기본 크기가 각기 다른 그룹을 포함하는 특정 Comparator를 구현하는 것입니다. 그런 다음 특정 크기가 속하는 Set를 결정하여 -1,0,1 관계를 구현할 수 있습니다.

더 효과적으로 수행 할 수있는 방법이 있습니까? 특히 저는 누군가가 커다란 또 다른 방법을 생각해 내면 2 주 후에 걱정할 것입니다.

편집 : 실제 비교기가 아닌지 확인하려면 질문이 있습니다. 각 그룹을 포함하는 세트가있는 설정입니다. 이 상황을 처리하는 정상적인 방법입니까? 새 크기를 추가 할 때마다 전체 재 컴파일/배포가 필요하지 않으므로 어떻게해야합니까?

+0

@downvote : 질문에 대한 문제점을 알고 싶습니다. 다시 생각해 보겠습니다. – thedan

+0

데이터가 어떻게 생겼는지에 대한 구체적인 예를 제시하는 것이 도움이 될 것이라고 생각합니다. –

답변

1

사용자 지정 비교기 입니다. 나는 이것이 왜 충분히 견고하지 않은지 당신이 왜 걱정하는지 이해하지 못합니다.

+0

그것의 세트에있는 각 항목 그룹의 처리에 대해 내가 걱정하는 비교기를 사용하지 않습니다. 명확성을 위해 편집을 추가했습니다. – thedan

0

문자열 모음 (또는 일반적으로 개체)에 임의의 순서를 지정하려면이를 수행하는 표준 방법은 제안대로 Comparator를 구현하는 것입니다.

'수동'솔루션 이외에도 문자열의 상대 edit distance을 표준 예제와 비교하는 것이 좋습니다. 더 이상 유연한 것입니다 당신이 생각하지 않은 대안에 작동한다는 의미입니다. 그러나 관련 업무 측면에서 볼 때 애플리케이션에 과도한 부담이 될 수 있습니다.

+0

링크를 제공해 주셔서 감사합니다. 그래도 과장된 것처럼 보입니다. – thedan

1

간단한 접근 방법은 리소스 번들에서 크기 별칭을로드하는 것입니다. 일부 예제 코드 (같은 패키지에있는 모든 파일을 넣어) :

인터페이스는 크기 속성

public interface Sized { 
    public String getSize(); 
} 

제품 클래스

public class Product implements Sized { 

    private final String size; 

    public Product(String size) { 
     this.size = size; 
    } 

    public String getSize() { 
     return size; 
    } 

    @Override 
    public String toString() { 
     return size; 
    } 
} 

마법을 수행하는 비교기를 캡슐화 :

import java.util.Comparator; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.ResourceBundle; 

public class SizedComparator implements Comparator<Sized> { 

    // maps size aliases to canonical sizes 
    private static final Map<String, String> sizes = new HashMap<String, String>(); 

    static { 
     // create the lookup map from a resourcebundle 
     ResourceBundle sizesBundle = ResourceBundle 
       .getBundle(SizedComparator.class.getName()); 
     for (String canonicalSize : sizesBundle.keySet()) { 
      String[] aliases = sizesBundle.getString(canonicalSize).split(","); 
      for (String alias : aliases) { 
       sizes.put(alias, canonicalSize); 
      } 
     } 
    } 

    @Override 
    public int compare(Sized s1, Sized s2) { 
     int result; 
     String c1 = getCanonicalSize(s1); 
     String c2 = getCanonicalSize(s2); 
     if (c1 == null && c2 == null) { 
      result = 0; 
     } else if (c1 == null) { 
      result = -1; 
     } else if (c2 == null) { 
      result = 1; 
     } else { 
      result = c1.compareTo(c2); 
     } 
     return result; 
    } 

    private String getCanonicalSize(Sized s1) { 
     String result = null; 
     if (s1 != null && s1.getSize() != null) { 
      result = sizes.get(s1.getSize()); 
     } 
     return result; 
    } 

} 

SizedComparator.properties :

1 = Small,tiny 
2 = medium,Average 
3 = Large,big,HUGE 

(단지 행복 흐름) 단위 테스트 : ResourceBundles을 자동으로 캐시됩니다

import org.junit.Before; 
import org.junit.Test; 

public class FieldSortTest { 

    private static final String SMALL = "tiny"; 
    private static final String LARGE = "Large"; 
    private static final String MEDIUM = "medium"; 

    private Comparator<Sized> instance; 

    @Before 
    public void setup() { 
     instance = new SizedComparator(); 
    } 

    @Test 
    public void testHappy() { 
     List<Product> products = new ArrayList<Product>(); 
     products.add(new Product(MEDIUM)); 
     products.add(new Product(LARGE)); 
     products.add(new Product(SMALL)); 

     Collections.sort(products, instance); 

     Assert.assertSame(SMALL, products.get(0).getSize()); 
     Assert.assertSame(MEDIUM, products.get(1).getSize()); 
     Assert.assertSame(LARGE, products.get(2).getSize()); 
    } 
} 

참고. 당신과 프로그래밍의 ResourceBundle를 다시로드 할 수 있습니다 :

ResourceBundle.clearCache(); 

(자바 1.6부터). 또는 일부 Spring magic을 사용하여 자동 다시로드 메시지 리소스를 만들 수 있습니다.

까다로운 속성 파일에서 읽는 것이 충분하지 않은 경우 데이터베이스에서 크기 별칭도 쉽게 유지할 수 있습니다.

+0

여기에 몇 가지 흥미로운 아이디어가 있습니다. 시간을내어 주셔서 감사합니다. – thedan

+0

실제로 코드도 작동합니다 (- : –