[Stream] Java Stream 정렬(sort) 사용법(sorted)(1)

2019. 12. 20. 22:353_개발/3_1_JAVA

Stream에서는 정렬을 제공한다.

 

1. 객체에 비교에 대해 선언하지 않은 경우

sorted​(Comparator<? super T> comparator)   

 

사용법 

> 객체 (Cat.java)

public class Cat {
	
	public Cat(int number, String name) {
		this.number = number;
		this.name = name;
	}
	
	private int number;
	private String name;
	
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

 

 

객체에 별 내용 없이, 생성자와 간단한 변수의 getter, setter 함수만 넣어보았다.

일반적으로 개발할 때 많이 사용하는 방법을 축약해 보았다.

위와 같이 객체 내에 비교에 대한 내용이 전혀 없는 그냥 순수하게 객체만 선언한 경우에는 Comparator를 이용하여 비교를 한다.

 

import java.util.Comparator;

 

> 객체에 값 입력

List<Cat> cats = Arrays.asList(
	new Cat(1, "mina"),    
	new Cat(2, "sana"),    
	new Cat(3, "momo"),
	new Cat(4, "jihyo")
 );

 

고양이 함수에 4개의 객체를 추가하였다.

 

> sort 사용

import java.util.List;
import java.util.Arrays;
import java.util.Comparator;

public class CatStream {

	public static void main(String[] args) {
		List<Cat> cats = Arrays.asList(
			new Cat(2, "sana"),    
			new Cat(3, "momo"),
			new Cat(1, "mina"),    
			new Cat(4, "jihyo")
		 );

		// 1. getNumber로 정순
		cats.stream()
		.sorted(Comparator.comparing(Cat::getNumber)) // 정렬 Cat의 number 변수로 정렬한다.
		.forEach(System.out::println); // 출력
	}
}

결과값

Cat [number=1, name=mina]
Cat [number=2, name=sana]
Cat [number=3, name=momo]
Cat [number=4, name=jihyo]

 

// 2. getNumber로 역순
cats.stream()
.sorted(Comparator.comparing(Cat::getNumber).reversed()) // 정렬 Cat의 getNumber로 역순정렬
.forEach(System.out::println); // 출력

결과값

Cat [number=4, name=jihyo]
Cat [number=3, name=momo]
Cat [number=2, name=sana]
Cat [number=1, name=mina]

 

위와 같은 방법으로 문자열도 가능하다.

// 3. 이름으로 순차정렬
cats.stream()
.sorted(Comparator.comparing(Cat::getName))
.forEach(System.out::println); 

// 4. 이름으로 역순정렬
cats.stream()
.sorted(Comparator.comparing(Cat::getName).reversed())
.forEach(System.out::println); 

결과값

Cat [number=4, name=jihyo]
Cat [number=1, name=mina]
Cat [number=3, name=momo]
Cat [number=2, name=sana]
====================
Cat [number=2, name=sana]
Cat [number=3, name=momo]
Cat [number=1, name=mina]
Cat [number=4, name=jihyo]

 

다수 정렬(두가지 이상을 이용한 정렬) 

// 1. 이름으로만 정렬한 경우
cats.stream()
.sorted(Comparator.comparing(Cat::getName))
.forEach(System.out::println);  

System.out.println("===============================");

// 2. 이름으로 정렬 후 숫자로 정렬한 경우 
cats.stream()
.sorted(Comparator.comparing(Cat::getName)
	.thenComparing(Cat::getNumber).reversed())
.forEach(System.out::println); 

결과값

 

위와 같이 첫 번째에 name로 순차 정렬한 후, thenComparing을 이용하여 

숫자로 한 번 더 정렬한다.

 

1. 이름으로만 정렬한 경우

Cat [number=4, name=jihyo]
Cat [number=1, name=mina]
Cat [number=3, name=momo]
Cat [number=2, name=sana]
===============================

2. 이름으로 정렬 후, 숫자로 역순정렬한 경우
Cat [number=2, name=sana]
Cat [number=3, name=momo]
Cat [number=1, name=mina]
Cat [number=4, name=jihyo]

 

sorted는 두가지가 있는데 한가지는 객체 내에 compare 함수를 넣어서 stream().sorted​() 하는 방법과

compare를 이용하여 객체의 값들을 비교하여 정렬하는 방법이 있다.

 

compare 함수를 객체에 넣는 방법보다

저런 방식으로 정렬하는 경우가 개발하다보면 더 많아서

간단하게 정리해 보았다.