2016-09-17 4 views
1

세트에서 문제가 생기는 것은 비교 가능한 인터페이스를 사용하여 내 기본 정렬 순서를 만드는 것입니다. (int eid,String ename)eid만을 기준으로 내림차순으로 정렬하고 싶습니다. 그래서 이것은 내가 comapreTo 방법으로 이해할 수없는 논리였습니다.Java comparable interface in sorting

public class First implements Comparable<First> { 

private final int eId; 
private final String eName; 

public First(int eId, String eName){ 
    this.eId = eId; 
    this.eName = eName; 
} 

public int getEId() { 
    return eId; 
} 

public String toString(){ 
    return eName + "------" + eId; 
} 

public int compareTo(First obj){ 
    int eId1 = this.eId; 
    First f = (First) obj; 
    int eId2 = f.eId; 
    if (eId1 < eId2){ 
     return -1; 
    } else if (eId1 > eId2){ 
     return +1; 
    } else { 
     return 0; 
    } 
}} 

이 방법이 어떻게 적용되며 구현 방법이 다른가요?

답변

2

당신은 당신이 아직도 그 끝 명확하지 않을 수 있습니다 생각 "어떻게 작동하는지 '묻는 질문의 일부에 대한 이해를 표현한다. 일부 답변에 대한 귀하의 의견을 기반으로 일부 코드 뒤에 "논리"를 이해하지 못하는 것을 참조하십시오.

compareTo을 구현하는 적절한 방법이라고 생각하면 Mark Rotteveel이 제시 한 예제를 논리로 설명합니다.사용자가 만든 클래스를하다 -

public int compareTo(First other){ 
if (eId < other.getEId()){ 
    return -1; 
} else if (eId > other.getEId()){ 
    return +1; 
} else { 
    return 0; 
} 
} 

우리는 유형 First의 목적은 매개 변수에 걸릴 compareTo 방법이있다. 이 유형에는이 클래스에 포함 된 모든 속성이 포함됩니다 (예 : getEId 메소드를 사용하여 First 클래스에서 찾을 수있는 개인 전역 변수 eId을 반환 할 수 있음).

이제 것은 compareToother 매개 변수는이 자신의 First 개체의 인스턴스를, 그리고 당신이 compareTo 방법 내부 (: if (eId < other.getEId())이 부분)과 비교하는 것과 같은 하나입니다. compareTo 방법 내부

우리는 compareTo 방법에 인수로 전달 된 First 개체에 대해 생성 된 eId에 (현재 전역 변수 eId을 의미하는) eId 여부를 확인하는 경우 - 다른 문을 사용합니다. 따라서이 두 값은 이 아니며 동일한 값인이 아닙니다.

public First(int eId, String eName){ 
this.eId = eId; 
this.eName = eName; 
} 

당신은 다음과 같은 두 다른First 개체를 만들 수 있습니다 :

당신은 당신이 그것의 프로그래밍 생각이 방법에 새로운 말했듯이

, 당신은 생성자가 클래스 First했다 이 예에서

First obj1 = new First(5, "Object 1"); 
First obj2 = new First(12, "Object 2"); 

obj1obj2하지 같은 객체 및 inherentl있다 y는 다른 eId 값을가집니다. 예를 들어, compareTo 메소드에 전달하는 메소드는 obj2 일 수 있습니다. 이는 현재 비교 대상인 코드와 다를 수 있습니다. 우리는이 compareTo(obj2) 같은 방법으로 obj2를 통과 할 때

그래서,이 그것을 읽는 코드의 부분에 도달하면 other.getEId는 분명히 if 문 내부의 eId는 다른 eId을 반환 obj2.getEId을 수행하는 것을 의미한다. 이 예제에서 ' obj2.getEId'은 정수 12를 반환합니다. 왜냐하면 여러분이 보았을 때 eIdobj2 일 때 12로 설정했기 때문입니다. 현재와 ​​비교하는 eId 정수의 측면에서 낮은 값의 경우

은 if-else 문에서 코드의 나머지 부분은 else ifreturn +1을 더 아래로 이동하거나, return -1, 매우 간단합니다 eId에 따라 정렬하십시오. 다른 경우에는 0을 반환하고이 경우에는 eId이라는 측면에서 같을 것이기 때문입니다.

compareTo 내에서 비교 된 eId의 인스턴스가 어떻게 다른지에 대한 논점에서 코드를 조금 분명히하기를 바랍니다.

1

equals 메서드와 ==!= 연산자는 같음/부등호를 테스트하지만 상대 값을 테스트하는 방법은 제공하지 않습니다. 어떤 클래스 (예 : String과 자연 순서가있는 다른 클래스)는 compareTo 메서드를 정의하는 Comparable 인터페이스를 구현합니다. Collections.sort() 또는 Arrays.sort() 메소드와 함께 사용하려면 클래스에 Comparable<T>을 구현해야합니다. 귀하의 비교 방법이 부족

1

는 적절한 예는 다음과 같습니다

public int compareTo(First other){ 
    if (eId < other.getEId()){ 
     return -1; 
    } else if (eId > other.getEId()){ 
     return +1; 
    } else { 
     return 0; 
    } 
} 

Comparable 인터페이스를 입력하여 비교됩니다 데이터의 종류를 알 수 있습니다. 이렇게하면 적절한 비교가 이루어집니다. 귀하의 예가 정말 빨리 NullPointerException에 들어갈 수 있습니다.

+0

나는 당신의 화염을 없앴습니다. 그것은 질문에 답하지 않고 오직 실제 답변에서 벗어나는 역할을합니다. 미래에는 질문의 결함을 지적하기 위해 주석을 사용하고 [좋게 생각하십시오] (http://stackoverflow.com/help/be-nice)를 기억하십시오. –

+0

다음 번에 코드를 편집 한 도움을 주셔서 감사합니다.임베디드 프로그래밍에 초보자는 논리가 어떻게 작동하는지 설명해주십시오. – Digs

1

내가 당신의 질문은 기본적으로 추측 어떻게 작동하는지 설명해주십시오,

이유는이 목록을 정렬 할 수있는 유사한 인터페이스를 구현해야합니까?

목록을 정렬하려면 먼저 Java에 두 개체를 비교하는 방법을 알려줘야합니다. 이렇게하면 Java는 어느 객체가 "덜"이고 어느 객체가 "더 큽니까"를 파악할 수 있습니다. 이 정보를 사용하여 목록을 오름차순 또는 내림차순으로 정렬 할 수 있습니다.

Java가 더 크고 어느 것이 더 적은지 어떻게 말합니까?

thisother 인수보다 큰 경우 1을 반환합니다. thisother 인수보다 작 으면 -1을 반환합니다. 그렇지 않은 경우 0을 반환하십시오.

다른 구현 방법이 있습니까?

실제로 현재 compareTo 메서드는 컴파일되지 않습니다. 더 나은 구현은 다음과 같습니다 내가 본 적이 없기

public int compareTo(First other){ 
    return Integer.compare(this.getEId(), other.getEId()); 
} 
+0

'this'와'other'는 모두 같은 변수를 호출합니까? – Digs

+0

예. 'this'와'other' 둘 다에'getEId'를 호출합니다. 그런 다음'Integer.compare'를 사용하여 반환 값을 비교합니다. @Digs – Sweeper

+0

내 대답이 귀하의 질문에 대한 대답이라고 생각하시면 그 확인 표시를 클릭하여 동의하십시오. @Digs – Sweeper