JDK 라이브러리의 코드에서 정렬, 리버싱은 많이 사용된다.
정렬을 위해 리스트에 대해 sort() 메서드를 사용한다. 이 메서드는 void메서드 이기 때문에 원본 리스트를 보존하기 위해서 복사본을 만들어 두어야 하고 원본이 아닌 복사복에 대해서 sort() 메서드는 호출해야한다.
이젠 stream 의 sorted()를 사용하면 번거러운 작업을 피할 수 있다.
예제소스1은 하나의 값으로 정렬.
예제소스2는 복수의 값을 비교하여 정렬
예제소스1
public class Person { private final String name; private final int age; public Person(final String theName, final int theAge) { name = theName; age = theAge; } public String getName() { return name; } public int getAge() { return age; } public String toString() { return String.format("%s - %d", name, age); } }
final List<Person> people = Arrays.asList( new Person("Zohn", 25), new Person("Sara", 21), new Person("Jane", 21), new Person("Greg", 35)); //java7 sort 사용 Collections.sort(people, new Comparator<Person>() { public int compare(Person o1, Person o2) { return o1.getName().compareTo(o2.getName()); } }); Collections.sort(people, new Comparator<Person>() { public int compare(Person o1, Person o2) { return o1.getName().compareTo(o2.getName()); } }); System.out.println("sort 이름순 정렬 "+people); //java8 sorted 사용 List<Person> people1= people.stream() .sorted(Comparator.comparing((Person person) -> person.getAge())).collect(Collectors.toList()); System.out.println("sorted 나이순 정렬 "+people1); List<Person> people2= people.stream() .sorted(Comparator.comparing((Person person) -> person.getName())).collect(Collectors.toList()); System.out.println("sotred 이름순 정렬 "+people2); }
출력
sort 이름순 정렬 [Greg - 35, Jane - 21, Sara - 21, Zohn - 25] sorted 나이순 정렬 [Jane - 21, Sara - 21, Zohn - 25, Greg - 35] sotred 이름순 정렬 [Greg - 35, Jane - 21, Sara - 21, Zohn - 25] |
예제소스2
정렬 조건 : 우선노출여부가 Y인게 1순위, 영역코드 2순위, 노출순위 3순위로 정렬.
복수의 조건으로 정렬할때는 .thenComparing 을 사용한다.
public class Person { public Person(String prioYn, String expsFdC, String prioOr) { this.prioYn = prioYn; // 우선노출여부 this.expsFdC = expsFdC; // 영역코드 this.prioOr = prioOr; // 노출순위 } /** * The name of the person. */ public String prioYn; public String expsFdC; public String prioOr; public String getPrioYn() { return prioYn; } public void setPrioYn(String prioYn) { this.prioYn = prioYn; } public String getExpsFdC() { return expsFdC; } public void setExpsFdC(String expsFdC) { this.expsFdC = expsFdC; } public String getPrioOr() { return prioOr; } public void setPrioOr(String prioOr) { this.prioOr = prioOr; } @Override public String toString() { return "Person [prioYn=" + prioYn + ", expsFdC=" + expsFdC + ", prioOr=" + prioOr + "]"; } }
List<Person> peopleList = new ArrayList<>(); peopleList.add(new Person("Y", "B", "1")); peopleList.add(new Person("N", "B", "0")); peopleList.add(new Person("Y", "B", "3")); peopleList.add(new Person("Y", "B", "2")); peopleList.add(new Person("", "A", "")); peopleList.add(new Person("", "A", "")); for(Person personVO : peopleList) { System.out.println(personVO.toString()); } System.out.println("---------------------------------------------------------"); List<Person> peopleSortedList = new ArrayList<>(); peopleSortedList = peopleList.stream().map(p -> { // expsFdC(영역코드)가 A인것은 우선노출여부가 없으므로 N으로 set Person obj = p; if("A".equals(obj.getExpsFdC())){ obj.setPrioYn("N"); } return obj; }).sorted(Comparator.comparing(Person::getPrioYn).reversed() .thenComparing(Comparator.comparing(Person::getExpsFdC)) .thenComparing(Comparator.comparing(Person::getPrioOr))) .collect(Collectors.toList()); System.out.println("peopleSortedList"); for(Person personVO : peopleSortedList) { System.out.println(personVO.toString()); } }
출력
Person [prioYn=Y, expsFdC=B, prioOr=1] Person [prioYn=N, expsFdC=B, prioOr=0] Person [prioYn=Y, expsFdC=B, prioOr=3] Person [prioYn=Y, expsFdC=B, prioOr=2] Person [prioYn=, expsFdC=A, prioOr=] Person [prioYn=, expsFdC=A, prioOr=] --------------------------------------------------------- peopleSortedList Person [prioYn=Y, expsFdC=B, prioOr=1] Person [prioYn=Y, expsFdC=B, prioOr=2] Person [prioYn=Y, expsFdC=B, prioOr=3] Person [prioYn=N, expsFdC=A, prioOr=] Person [prioYn=N, expsFdC=A, prioOr=] Person [prioYn=N, expsFdC=B, prioOr=0] |
'Programming > JAVA' 카테고리의 다른 글
[JAVA] 람다식 기본 예제 1 (map, filter, reduce, collect) (2) | 2018.01.19 |
---|---|
[JAVA] 람다식(lambda expression) 이란? (0) | 2018.01.19 |
[JAVA] 문자 관련 stringUtil 모음 (0) | 2017.12.24 |
[JAVA] 날짜 관련 dateutil 모음 (0) | 2017.12.24 |
java.security.KeyException (0) | 2016.05.18 |