4

해당 필드 중 하나에서 특정 순서로 스트림을 정렬하려고합니다.스위치와 같은 Java 스트림 정렬 조건부

이제 스트림을 목록으로 변환하고 스위치를 사용한 다음 원하는 순서로 목록에 다시 결합하여이 작업을 수행하고 있습니다. 이 사용 스트림 분류 방법 과 같은 사용자 정의 비교 또는 무언가를 사용을 달성하기 위해 어떤 변화가 있는지

 

    fruits.forEach(fruit -> { 
       switch (fruit.getName()) { 
        case "Orange": 
         orangesList.add(fruit); 
         break; 
        case "Apple": 
         applesList.add(fruit); 
         break; 
        case "WaterMelon": 
         watermelonList.add(fruit); 
         break; 
        default: 
         otherFruits.add(fruit); 
         break; 
       } 
    }); 

    genericFruitList.addAll(0, orangeList); 
    genericFruitList.addAll(1, applesList); 
    genericFruitList.addAll(2, watermelonList); 
    genericFruitList.addAll(3, otherFruits); 

이 궁금하다.

미리 감사드립니다. 특정 순서로 과일을 정렬 할 경우

+4

'Collectors.groupingBy (Fruit :: getName)'은 스위치처럼 이름으로 과일을 그룹화합니다. 그런 다음'addAll'을 이렇게 할 수 있습니다. –

+0

도우미 클래스를 만들면 적절한 목록을 얻을 수 있습니다 : fruitHelper.getList (fruit.getName) –

+3

현재 논리가 이상합니다. 결과적으로'genericFruitList'는'orange, apple, watermelon, other, other, watermelon, apple, orange'가 될 것입니다. 삽입 지점을 지정하는 것을 의미합니까 아니면 마지막에 모두 추가하려고합니까? –

답변

6

당신은 수 b

List<String> order = Arrays.asList("Orange", "Apple", "WaterMelon"); 
Comparator<String> comp 
    = Comparator.comparingInt(name -> order.indexOf(name)-Integer.MIN_VALUE); 

같이 명시 적으로 순서를 사용하여 비교를 만들 수 있습니다 전자는 비효율적 조용 할 수 있습니다, 특히 List.indexOf 기반 비교기와, 전체 목록을 정렬 그러나
List<Fruit> genericFruitList = fruits 
    .sorted(Comparator.comparing(fruit -> fruit.getName(), comp)) 
    .collect(Collectors.toList()); 

처럼 사용할. 대안은 Fruit 만 정렬 별개의 매핑 당 해시 조회를 수행

List<Fruit> genericFruitList = fruits 
    .collect(Collectors.groupingBy(fruit -> fruit.getName())) 
    .entrySet().stream() 
    .sorted(Map.Entry.comparingByKey(comp)) 
    .flatMap(e -> e.getValue().stream()) 
    .collect(Collectors.toList()); 

될 것이다.

이것은 Bucket Sort의 변형으로 볼 수 있습니다.

+0

고마워요. 이것은 나를 위해 완벽하게 작동 :) – Antonio682

5

(오렌지 먼저, 다음 사과, 후 수박, 다음 "기타"), 당신은 따라서 비교를 정의 할 수 있습니다 : 일종의 다음

List<String> order = Arrays.asList("Orange", "Apple", "Watermelon"); 
Comparator<Fruit> comparator = Comparator.comparing(f -> { 
    int i = order.indexOf(f.getName()); 
    return (i >= 0) ? i : order.size(); 
}); 

과 :

List<Fruit> genericFruitList = fruits.stream().sorted(comparator).collect(Collectors.toList()); 
+0

btw 구아바도 여기에서 사용할 수있는'Ordering.explicit (List )'을 가지고 있습니다. – Eugene

+1

@Eugene [ "Java 8을 사용하는 경우이 클래스는 현재 사용되지 않습니다."] (https://google.github.io/guava/releases/23.0/api/docs/com/google/common/collect/Ordering. html). 또한 "기타"값은 처리하지 않습니다. –