비교기, 컬렉션 정렬 - 1

"안녕, 아미고!"

"안녕, 빌라보!"

"오늘 우리는 작지만 흥미롭고 유용한 주제인 컬렉션 정렬을 살펴볼 것입니다."

"분류 중이라고요? 그런 얘기를 들은 적이 있어요."

"오래 전에는 모든 프로그래머가 정렬 알고리즘을 작성할 수 있어야 했습니다. 작성할 수 있었고 작성해야 했습니다. 하지만 그런 시대는 끝났습니다. 오늘날 자신만의 정렬 코드를 작성하는 것은 나쁜 형식으로 간주됩니다. 발명했다."

"Java(및 기타 프로그래밍 언어)에서는 정렬이 이미 구현되어 있습니다.  이미 존재하는 것을 올바르게 사용하는 방법을 배우는 것이 귀하의 임무입니다. "

"좋아요."

" 컬렉션 도우미 클래스에는 컬렉션을 정렬하는 데 사용되는 정적 정렬 메서드가 있습니다. 더 정확하게는 목록입니다. 맵 및 세트의 요소에는 순서/인덱스가 없으므로 정렬할 항목이 없습니다."

"예, 기억합니다. 이 방법을 사용하여 숫자 목록을 정렬한 적이 있습니다."

"훌륭합니다. 하지만 이 방법은 보기보다 훨씬 더 강력합니다. 어떤 기준에 따라 숫자뿐만 아니라 모든 객체를 정렬할 수 있습니다. 두 가지 인터페이스가 방법을 도와줍니다. Comparable 및 Comparator 입니다 . "

"때로는 숫자가 아닌 개체를 정렬해야 합니다. 예를 들어 사람 목록이 있고 연령별로 정렬하고 싶다고 가정해 보겠습니다. 이를 위한 Comparable 인터페이스가 있습니다."

"먼저 예를 보여드리겠습니다. 그러면 모든 것이 더 명확해집니다."

public class Woman implements Comparable<Woman>
{
public int age;

public Woman(int age) {
this.age = age;
}

public int compareTo(Woman o)
{
return this.age - o.age;
}
}
사용 방법의 예:
public static void main(String[] args )
{
ArrayList<Woman> women = new ArrayList<Woman>();
women.add(new Woman(18));
women.add(new Woman(21));
women.add(new Woman(5));

Collections.sort(women);
}

"객체를 정렬하려면 먼저 비교 방법을 알아야 합니다. 이를 위해 Comparable을 사용합니다. Comparable 인터페이스 는 제네릭 인터페이스이므로 유형 인수를 허용합니다. 단 하나의 제네릭 메소드인 compareTo(T o)만 있습니다. 이 메서드는 현재 객체(this)와 인수로 전달된 객체(o)를 비교하는 것으로, 즉 우리 클래스에서 이 메서드를 구현한 후 현재 객체(this)와 전달된 객체를 비교하는 데 사용해야 합니다. "

"그리고 compareTo는 어떻게 작동합니까? 전달된 개체가 더 크거나 작은지에 따라 true 또는 false를 반환할 것으로 예상했습니다."

"여기서 문제가 더 까다롭습니다. compareTo 메서드는 true/false를 반환하지 않습니다. 대신 int를 반환합니다. 이것은 실제로 단순성을 위해 수행됩니다.

"컴퓨터가 한 숫자가 다른 숫자보다 큰지 여부를 결정해야 할 때 첫 번째 숫자에서 두 번째 숫자를 뺀 다음 결과를 확인합니다. 결과가 0이면 숫자가 같습니다. 결과가 0보다 작으면 이면 두 번째 숫자가 더 크고 결과가 0보다 크면 첫 번째 숫자가 더 큽니다."

"동일한 논리가 여기에 적용됩니다. 사양에 따르면 비교 대상이 같으면 compareTo 메서드는 0을 반환해야 합니다. compareTo 메서드가 0보다 큰 숫자를 반환하면 개체가 전달된 개체보다 큽니다. " 메서드가 0보다 작은 숫자를 반환하면 'this'는 전달된 개체보다 작습니다."

"조금 이상하네요."

"예, 하지만 단순히 숫자 속성을 기반으로 개체를 비교하는 경우 하나를 빼서 개체 간의 차이를 반환할 수 있습니다. 위의 예에서 수행된 방식입니다."

public int compareTo(Woman o)
{
return this.age - o.age;
}

"나는 모든 것을 이해한다고 생각합니다. 하지만 그렇지 않을 수도 있습니다. 하지만 거의 모든 것입니다."

"좋습니다. 이제 좀 더 실용적인 문제를 생각해 보겠습니다. 중국에서 여성복을 만드는 멋진 웹사이트를 작성했다고 가정해 보겠습니다. 고객을 설명하기 위해 여성 클래스를 사용합니다. 고객을 모두 볼 수 있는 테이블이 있는 웹페이지도 만들었습니다. . 그런데 문제가…

"당신의 여성 개체에는 나이뿐만 아니라 이름, 성, 키, 몸무게, 자녀 수 등의 다른 데이터도 포함되어 있습니다."

"사용자 테이블에는 많은 열이 있으며 여기에 질문이 있습니다. 다양한 기준으로 사용자를 어떻게 정렬합니까? 체중, 연령, 성으로?"

"음. 네, 열별로 정렬할 수 있는 표를 자주 보거든요. 그럼 어떻게 하죠?"

"이를 위해 오늘 말씀드리고자 하는 두 번째 인터페이스인 Comparator 인터페이스가 있습니다. 비교 메서드도 있지만 하나가 아닌 두 개의 인수를 취합니다: int compare(T o1, To o2). 방법은 다음과 같습니다. 공장:"

public class Woman
{
public int age;
public int childrenCount;
public int weight;
public int height;
public String name;

public Woman(int age) {
this.age = age;
}
}
사용 방법의 예:
public static void main(String[] args )
{
ArrayList<Woman> women = new ArrayList<Woman>();
women.add(new Woman(18));
women.add(new Woman(21));
women.add(new Woman(5));

Comparator<Woman> compareByHeight = new Comparator<Woman>() {
public int compare(Woman o1, Woman o2) {
return o1.height - o2.height;
}
};

Collections.sort(women, compareByHeight);
}

"비교자 인터페이스는 비교되는 개체의 클래스 내부에 있는 개체 비교 논리를 숨기지 않습니다. 대신 별도의 클래스에서 구현됩니다."

"그래서 Comparator 인터페이스를 구현하는 여러 클래스를 만들고 각각 다른 속성을 비교하도록 할 수 있습니다. 하나는 무게, 다른 하나는 나이, 세 번째는 키입니까?"

"예, 매우 간단하고 편리합니다."

"우리는 단지 Collections.sort 메서드를 호출하여 개체 목록과 다른 특수 개체를 두 번째 인수로 전달하여 Comparator 인터페이스를 구현하고 정렬 프로세스에서 개체 쌍을 올바르게 비교하는 방법을 알려줍니다."

"음. 모든 것을 이해한 것 같습니다. 한 번 시도해 보겠습니다. 사용자를 가중치별로 정렬해야 한다고 가정해 보겠습니다. 다음과 같을 것입니다."

가중치를 기준으로 사용자를 정렬하는 예:
Comparator<Woman> compareByWeight = new Comparator<Woman>() {
public int compare(Woman o1, Woman o2) {
return o1.weight - o2.weight;
}
};

Collections.sort(women, compareByWeight);

"네, 맞습니다."

"좋습니다. 하지만 역순으로 정렬하려면 어떻게 해야 합니까?"

"생각해봐. 대답은 아주 간단해!"

"내가 해냈어! 이렇게:"

오름차순 정렬:
return o1.weight - o2.weight;
내림차순 정렬:
return o2.weight – o1.weight;

"맞아. 잘했어."

"성으로 정렬하려면 어떻게 해야 합니까? 문자열은 어떻게 정렬합니까, Bilaabo?"

"String 클래스는 이미 compareTo 메소드를 구현하고 있습니다. 호출하기만 하면 됩니다."

사용자를 이름별로 정렬하는 예:
Comparator<Woman> compareByName = new Comparator<Woman>() {
public int compare(Woman o1, Woman o2) {
return o1.name.compareTo(o2.name);
}
};

Collections.sort(women, compareByName);

"훌륭한 교훈이었습니다, Bilaabo. 대단히 감사합니다."

"그리고 고마워요, 친구!"