CodeGym /Java Blog /무작위의 /Java 컬렉션 정렬()
John Squirrels
레벨 41
San Francisco

Java 컬렉션 정렬()

무작위의 그룹에 게시되었습니다
데이터를 다루는 개발자로서 우리에게 필요한 가장 일반적인 기능 중 하나는 정렬입니다. 데이터를 정렬할 수 있으므로 알고리즘을 최적화하여 훨씬 더 빠르게 실행하고 필요한 데이터를 찾는 데 걸리는 시간보다 훨씬 짧은 시간 내에 찾을 수 있습니다. 그렇지 않으면 걸릴 것입니다. 오늘 강의에서는 Java Collections sort()에 대해 이야기하겠습니다. 빠른 사고 실험: 대학 명부를 통해 이름을 검색한다고 상상해 보십시오. 이 학교에는 수만 명의 학생이 있을 수 있습니다. 제공된 명단이 알파벳 순서가 아닌 경우 원하는 이름을 찾을 때까지 모든 페이지를 넘기고 매우 주의 깊게 살펴보고 이름을 건너뛰지 않았는지 확인해야 합니다. 반면에 명단이 알파벳 순으로 되어 있다면 덜 엄격하게 검색해야 할 뿐만 아니라 그러나 동일한 첫 글자로 명단의 섹션으로 쉽게 이동할 수 있으며 찾고 있던 사람을 찾을 때까지 계속해서 페이지를 크게 도약할 수 있습니다. 작업하는 데이터가 많을수록 데이터를 최대한 효과적이고 효율적으로 사용하는 것이 더 중요합니다. 이 기사에서는 Collections 정렬 방법을 사용하여 Java에서 List 구현(ArrayList 포함)을 정렬하는 방법을 살펴보겠습니다.

Java 컬렉션 정렬 방법을 사용하여 Java에서 ArrayList를 정렬하는 방법

Java Collections.sort 메소드에 대해 이야기해 봅시다. java.util 패키지에는 ArrayList를 포함하여 개발자가 자주 사용하는 많은 유용한 유틸리티와 패키지가 포함되어 있습니다. 다음과 같은 간단한 프로그램이 있다고 가정합니다.

import java.util.*;
import java.io.*;
class Main{
     public static void main(String[] args){
          List<String> colors = new ArrayList<String>();
          colors.add("Red    ");
          colors.add("Orange");
          colors.add("Green");
          colors.add("Blue");
    }
}
색상 목록을 알파벳순으로 인쇄할 수 있기를 원합니다. 어떻게 할 수 있습니까? java.util.Collections를 사용하면 정렬이 간단합니다.

Collections.sort(colors);
짜잔! 이제 색상 목록이 제자리에 정렬되었습니다. 다음과 같이 목록을 인쇄하는 경우:

System.out.println(colors);
그러면 다음과 같은 결과가 나타납니다.

[Blue, Green, Orange, Red]
얼마나 쉬웠습니까?! Collections.sort()를 사용하여 Integers, Floats 또는 해당 문제에 대한 다른 간단한 데이터 유형의 목록을 오름차순으로 정렬하는 것도 쉽습니다. 하지만 내림차순으로 정렬하려면 어떻게 해야 할까요? 이것이 의미가 있는 경우가 분명히 있습니다. 특정 수업에 대한 시험 점수 목록이 있고 최고 점수를 받은 학생이 누구인지 알아내고 싶다고 상상해 보십시오. 목록을 내림차순(가장 높은 점수부터)으로 정렬하여 원하는 답변이 맨 위에 오도록 하는 것이 훨씬 더 합리적입니다. 고맙게도 Collections.sort()는 선택적 두 번째 매개변수로 덮어써서 다음과 같이 할 수 있습니다.

sort(List l, Comparator c)
그러나 비교기가 무엇입니까? 비교기는 단순히 두 입력을 비교하고 어떤 입력이 먼저 오는지를 나타내는 숫자를 반환하는 함수입니다. 원시 데이터 유형의 ArrayList를 정렬하는 경우 Java Collections는 이미 reverseOrder() 비교자를 제공합니다. 다음과 같이 호출할 수 있습니다.

Collections.sort(colors, Collections.reverseOrder());
이제 색상이 제자리에서 역으로 정렬되었으므로 인쇄하면 다음과 같은 결과를 얻을 수 있습니다.

[Red, Orange, Green, Blue]

컬렉션을 사용하여 Java에서 기본이 아닌 데이터 유형을 정렬하는 방법

지금까지 Collections.sort() 메서드를 사용하여 Java에서 문자열 또는 int의 ArrayList를 정렬하는 것이 한 줄의 코드만큼 쉽다는 것을 확인했습니다. 그러나 종종 ArrayList는 기본이 아닌 데이터 유형을 저장합니다. 더 복잡한 속성이 있는 데이터로 작업하는 경우 이러한 개체를 나타내는 클래스와 해당 속성을 사용하여 개체를 서로 비교하는 방법을 작성하고 싶을 것입니다. 이에 대한 예를 살펴보기 위해 색상 목록을 정렬하는 예를 다시 살펴보겠습니다. 이번에는 문자열을 정렬하는 대신 Color 객체를 정렬할 것입니다. 기본 Color 클래스는 다음과 같습니다.

public class Color{
	private int r;
	private int g;
	private int b;
	private String name;

	Color(String name, int red, int green, int blue){
   	this.name = name;
    	this.r = red;
   	this.g = green;
   	this.b = blue;
	}
}
Color 클래스가 Collections.sort()와 호환되도록 하려면 Collections가 Color 객체를 비교하고 정렬하는 방법을 이해할 수 있도록 두 가지 작은 수정이 필요합니다.
  1. Color를 Comparable 객체로 만들기(add implements Comparable<Object>)
  2. 클래스의 compareTo 메서드 재정의(public int compareTo(Object o) 재정의)
이러한 수정을 통해 클래스는 이제 다음과 같이 보입니다.

public class Color implements Comparable<Object>{
	private int r;
	private int g;
	private int b;
	private String name;

	Color(int red int green, int blue, String name){
    	this.r = red;
   	this.g = green;
   	this.b = blue;
   	this.name = name;
	}

	@Override
	public int compareTo(Object o) {
    	Color c = (Color) o;
    	return this.name.compareTo(c.name);
	}
}
Color의 compareTo 메서드는 단순히 String의 compareTo 메서드를 호출합니다. 정렬은 알파벳순으로 수행됩니다. 예를 들어 빨간색 값을 기준으로 오름차순으로 정렬하려면 return 문을 return this.r - cr로 바꿀 수 있습니다. (녹색 값을 내림차순으로 정렬하려면 return cg - this.g;가 됩니다.) 이제 전화를 걸면

Collections.sort(colors);
Collections가 Color 객체를 비교하는 방법을 이해하기 때문에 문자열이 아닌 색상의 ArrayList에서 작동합니다. 객체가 Comparable<Object>를 구현하지 않도록 하려면 클래스에 대한 비교기를 작성하고 이를 2-매개변수 Collections.sort() 메서드에 전달할 수 있습니다. 비교기는 public int compare(Object one, Object two) 메서드를 재정의하고 Collections.sort() 메서드는 정렬하는 동안 객체를 비교하는 데 이 메서드를 사용합니다. SortByName 및 SortByRed 비교기의 예는 아래에 구현됩니다.

class SortByName implements Comparator<Color>
{
	public int compare(Color a, Color b)
	{
    	return a.name.compareTo(b.name);
	}
}

class SortByRGB implements Comparator<Color>
{
	public int compare(Color a, Color b)
	{
    	return a.r - b.r;
	}
}
이것으로 이제 전화할 수 있습니다.

Collections.sort(colors, new SortByName());
Color 클래스가 실제로 Comparable을 구현하지 않아도 여전히 작동합니다. 경우에 따라 람다 함수를 사용하여 이 작업이 인라인으로 수행되는 것을 볼 수 있습니다. 람다 함수는 기본적으로 이를 호출하는 코드 줄 내에서 정의할 수 있는 이름 없는 함수입니다. 하나의 특정 인스턴스에 대해서만 함수를 호출해야 하고 다른 곳에서 전체 개별 함수를 정의하고 싶지 않을 때 유용합니다. SortByName 비교기는 다음과 같이 람다 함수를 사용하여 인라인으로 정의할 수 있습니다.

Collections.sort(colors, (a, b)-> {
          return a.name.compareTo(b.name)});
짐작하셨겠지만 (a, b)는 람다 함수(비교할 두 객체)의 매개변수를 나타냅니다. ->는 뒤에 오는 것이 람다 함수 정의임을 나타냅니다. 그게 다야! 이제 Collections 패키지를 사용하여 Java에서 ArrayList를 정렬하는 가장 인기 있는 방법을 보았습니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION