2017-12-02 1 views
0

이름과 가격으로 제품을 비교하기 위해 Comparator를 구현할 방법을 찾고있었습니다. 여기에 유용한 정보가 많이 있습니다. How to sort by two fields in Java?을 찾고 비교기를 구현했습니다.메서드는 비교 자로 두 필드로 비교할 것이지만 하나만 주문합니다.

제품 이름을 올바르게 비교하지만 가격이 올바른 순서가 아닙니다. 알파벳순으로 가격을 오름차순으로 나열 할 예정입니다. 어떻게 구현할 수 있습니까? 내가 여기서 무엇을 놓치고 있니?

방법은

List<BaseProduct> sortedProductsList = StaticUtils.compareNamesAndPrices(products); 
for (BaseProduct product : sortedProductsList) { 
    System.out.println(String.format("Product name: %s -> Price: %s", product.getProductName(), product.getPrice().toString())); 
} 

은 내가 '방법 테스트 이름과 가격

public static List<BaseProduct> compareNamesAndPrices(List<BaseProduct> baseProducts) { 
    Comparator<BaseProduct> productComparator = Comparator.comparing(BaseProduct::getProductName) 
      .thenComparing(Comparator.comparing(BaseProduct::getPrice)); 
    return baseProducts.stream() 
      .sorted(productComparator) 
      .collect(Collectors.toList()); 
} 

에 의해 비교 : 여기

는 지금까지했습니다 것입니다 다음 출력을 얻었습니다 :

Product name: Bananas -> Price: 45 
Product name: Galaxy 7 phone -> Price: 400 
Product name: Xiaomi Mi5 -> Price: 370 
+2

출력은 어떻게되어야합니까? 당신이 공유하는 출력은 논리입니다, 나는 여기서 문제가있는 것을 보지 못합니다. –

+2

출력은 이름과 가격으로 정렬됩니다! 가격순 정렬은 동일한 이름의 제품에만 관련됩니다. – Harald

+0

알파벳순으로 이름을 올리고 가격을 오름차순으로 예상합니다. – samba

답변

1

이전 비교기 위에 thenComparing의 비교기를 구성하면 이전 비교자가 지정된 정렬 키로 적어도 두 개의 동일한 요소를 찾으면에만 고려됩니다.

출력을 보면 이름이 같은 제품이 없기 때문에 가격이 전혀 고려되지 않습니다.

은 당신이 언급 한을 것으로 생각 :

내가 오름차순으로 알파벳 순으로 이름과 가격을 기대하고있다.

사실의 간단한 문제는,이 는 제품 이름의 순서 또는 경품의 순서를 잃지 않고 수행 할 수 없습니다 수 있습니다.

귀하가 할 수있는 최선의 방법은 제품을 이름 또는 경품으로 적절하게 분류하는 것입니다.