본문 바로가기
Programming/Spring

Java / Spring / Comparable과 Comparator

by with chu 2021. 3. 9.
728x90

Comparable과 Comparator를 활용해서 상품목록 정렬하기


 

 

Comparable과 Comparator의 차이점

 

Comparable은 String이나 Integer의 데이터를 특정 조건으로 정렬하고 싶을 때 사용한다

출력할 때 Collections.sort(목록) method를 이용한다.
Comparator는 기존 정렬에서 내가 원하는 대로 특정 조건을 더 추가하여 다르게 정렬하고 싶을 때 사용한다

출력할 때 Collections.sort(목록,comparator별칭) method를 이용한다.

 

 


1) Controller

@Controller
public class ProductListController {
	@Autowired
	private ProductDaoInter Inter;
    
@RequestMapping("productListSort")
	public ModelAndView processSort(ModelAndView view, HttpServletRequest request,
			@RequestParam("order_by")String order_by) {
		//page처리
        ...
		//정렬기준 처리
		ProductComparator com = new ProductComparator();
		com.order_by = order_by;
		Collections.sort(list,com); 
		
		ArrayList<ProductDto> result = getListData(list, page);
		view.addObject("data",result);
		view.setViewName("productList");
		
		return view;
	}

정렬부분만 보면,

//정렬기준 처리
		ProductComparator com = new ProductComparator();
		com.order_by = order_by;
		Collections.sort(list,com); 

새로운 ProductComparator 객체 com을 만들고 com 안에 order_by 정렬조건을 넣어준다.

Collections.sort는 정렬하는 클래스이다. Collections.sort(목록,comparator별칭)의 형식으로 써준다.

 

 


1) DTO

public class ProductDto implements Comparable<ProductDto>{
	private String user_id,...; //생략
	private int product_id,...;
	
	@Override
	public int compareTo(ProductDto o) { 
	   return 0;
	}
    // 아래에는 getter,setter 생략

DTO 스스로를 정렬을 하나씩 비교할 수 있도록 Java의 기본 클래스인 Comparable을 implement 해준다. 그리고 부모 클래스 Comparable의 compareTo() 메소드를 Override 해준다.

 

 

 


3) Comparator

import java.util.Comparator;

public class ProductComparator implements Comparator<ProductDto>{

	public String order_by;
	
	@Override
	public int compare(ProductDto o1, ProductDto o2) {
		if(order_by.equals("views desc")) {
			if(o1.getViews() < o2.getViews()) {
				return 1;
			}return -1;
		}else if(order_by.equals("interest_count desc")){
			if(o1.getInterest_count() < o2.getInterest_count()) {
				return 1;
			}return -1;
		}else if(order_by.equals("product_price desc")){
			if(o1.getProduct_price() < o2.getProduct_price()) {
				return 1;
			}return -1;
		}else{
			if(o1.getProduct_price() > o2.getProduct_price()) {
				return 1;
			}return -1;
		}
	}

이 클래스에서 가격순/최신순/인기많은순 등 정렬조건들을 추가할 수 있다.

order_by String으로 어떤순으로 정렬할지 조건을 받아서 if 문으로 분류한 다음, 오름차순 또는 내림차순으로 정렬해준다.

ProductDto o1, ProductDto o2 로 두개를 정의해주고 DTO 자기자신 o1과 자기자신 o2를 서로 비교해서 정렬한다

 

 


4) productList.jsp

<th class="text-right" >
	<!-- 상품 정렬 -->
	<a href="productListSort?page=1&order_by=views desc">인기순</a>&emsp;
	<a href="productList?page=1">최신순</a>
	<a href="productListSort?page=1&order_by=interest_count desc">좋아요순</a> 
	<a href="productListSort?page=1&order_by=product_price desc">높은가격</a>
	<a href="productListSort?page=1&order_by=product_price asc">낮은가격</a>
</th>

정렬은 끝났으니 사용자가 원하는 상품 정렬조건을 클릭할 수 있도록 a태그로 정렬기준을 담아 출력해준다.

728x90

댓글