Post

(feat) Sort by ticketSales/review

✅ How to sort movie list by ticket sales/ review score

ticket sales, scoreAvg는 모두 movie table에 있음 두 가지 정렬 기준을 이용하여 movielist를 정렬한다. sorted() > Comparator.comparingDouble() > .reversed() 해서 ticket sales/ review score이 높은 순서대로 보인다. 즉, 예매율 높은 순, 평점 높은 순

🟢 sorted()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//sort
        List<MainPageResponseDto> mainPageResponseDtoList = new ArrayList<>();
        if(sort.equals("ticket-sales")){
            mainPageResponseDtoList= moviePage.stream()
                    .sorted(Comparator.comparingDouble(Movie::getTicketSales).reversed())
                    .map(movie -> new MainPageResponseDto(
                            movie.getPoster(),
                            movie.getTitleKorean(),
                            movie.getTicketSales(),
                            movie.getReleaseDate(),
                            movie.getScoreAvg(),
                            movie.getDDay()
                    ))
                    .toList();
        }else if(sort.equals("reviews")){
            mainPageResponseDtoList= moviePage.stream()
                    .sorted(Comparator.comparingDouble(Movie::getScoreAvg).reversed())
                    .map(movie -> new MainPageResponseDto(
                            movie.getPoster(),
                            movie.getTitleKorean(),
                            movie.getTicketSales(),
                            movie.getReleaseDate(),
                            movie.getScoreAvg(),
                            movie.getDDay()
                    ))
                    .toList();
        }else{
            throw new BadRequestException("Invalid sort criteria: " + sort);
        }

🟢 code with method

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public ResponseDto findMainPageSort(Pageable pageable, String sort) {

    // DTO List만드는 메소드
    List<MainPageResponseDto> mainPageResponseDtoList = moviePage.getContent().stream()
            .sorted(getComparator(sort))
            .map(movie -> new MainPageResponseDto(
                    movie.getPoster(),
                    movie.getTitleKorean(),
                    movie.getTicketSales(),
                    movie.getReleaseDate(),
                    movie.getScoreAvg(),
                    movie.getDDay()
            ))
            .toList();

    return new ResponseDto(HttpStatus.OK.value(), "Main page sort find success", mainPageResponseDtoList);
}
//sort 기준 만드는 method
private Comparator<Movie> getComparator(String sort) {
    if ("ticket-sales".equals(sort)) {
        return Comparator.comparingDouble(Movie::getTicketSales).reversed();
    } else if ("reviews".equals(sort)) {
        return Comparator.comparingDouble(Movie::getScoreAvg).reversed();
    } else {
        throw new BadRequestException("Invalid sort criteria: " + sort);
    }
}

🟢 Final code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//controller
    @GetMapping("/findBySort/{sort}")
    public ResponseDto findMainPageSort(Pageable pageable,
                                        @PathVariable String sort){
        return mainPageService.findMainPageSort(pageable, sort);
    }

//service
public ResponseDto findMainPageSort(Pageable pageable, String sort) {
        ArrayList<String> sortArray= new ArrayList();
        sortArray.add("ticket-sales");
        sortArray.add( "reviews");

        Page<Movie> moviePage= movieJpa.findAll(pageable);
        for(Movie movie: moviePage){
            //ticketSales
            List<Schedule> scheduleList= movie.getScheduleList();
            int remainingSeats= scheduleList.stream().mapToInt(Schedule::getRemainingSeats).sum();
            int totalSeats= scheduleList.stream().map(Schedule::getCinemaType).map(CinemaType::getTotalSeats).mapToInt(Integer::intValue).sum();
            if (totalSeats == 0) throw new NotFoundException("There are no total seats for this movie");
            double ticketSales= ((double) (totalSeats- remainingSeats)/totalSeats)*100;
            double formattedTicketSales= (double) Math.round(ticketSales*10.0)/10.0;


            //scoreAvg
            List<Review> reviewList= reviewJpa.findByMovieId(movie.getMovieId());
            int scoreSum= reviewList.stream().map(Review::getScore).mapToInt(Integer::intValue).sum();
            int countReview= reviewList.size();
            if(countReview == 0 )throw new NotFoundException("There are no reviews for this movie");
            double scoreAvg= (double) scoreSum / countReview;

            movie.setTicketSales(formattedTicketSales);
            movie.setScoreAvg(scoreAvg);
            movieJpa.save(movie);
        }
        //sort
        List<MainPageResponseDto> mainPageResponseDtoList = new ArrayList<>();
        if(sort.equals("ticket-sales")){
            mainPageResponseDtoList= moviePage.stream()
                    .sorted(Comparator.comparingDouble(Movie::getTicketSales).reversed())
                    .map(movie -> new MainPageResponseDto(
                            movie.getPoster(),
                            movie.getTitleKorean(),
                            movie.getTicketSales(),
                            movie.getReleaseDate(),
                            movie.getScoreAvg(),
                            movie.getDDay()
                    ))
                    .toList();
        }else if(sort.equals("reviews")){
            mainPageResponseDtoList= moviePage.stream()
                    .sorted(Comparator.comparingDouble(Movie::getScoreAvg).reversed())
                    .map(movie -> new MainPageResponseDto(
                            movie.getPoster(),
                            movie.getTitleKorean(),
                            movie.getTicketSales(),
                            movie.getReleaseDate(),
                            movie.getScoreAvg(),
                            movie.getDDay()
                    ))
                    .toList();
        }else{
            throw new BadRequestException("Invalid sort criteria: " + sort);
        }
        return new ResponseDto(HttpStatus.OK.value(), "Main page sort find success",mainPageResponseDtoList);

    }
This post is licensed under CC BY 4.0 by the author.