2013-06-12 4 views
0

나는 '저자'클래스 (현재는 이름 만 있음)와 해당 저자가 공통으로 갖고있는 기사의 수를 2 개 보유 할 수있는 'CoAutoria'클래스를 보유하고 있습니다.
공동 저자의 상위 10 명 (기사 수와 관련하여)을 알아 내기 위해 각 쌍마다 기사 합계를 보관하는 'CoAutoria'의 TreeSet을 만들었습니다. 나는 여러 해의지도를 돌아보고, 다른 저자와 그들의 공동 저자 세트를 모아야한다. 그런 다음 각 쌍에 대해 'CoAutoria'인스턴스를 만들고이를 트리 집합에 추가합니다 (아직 존재하지 않는 경우). 또는 기사의 수를 단순히 집합에있는 기사 수로 합합니다.에는 잘못된 결과가 포함되어 있습니다.

이미 compareTo 메서드를 만들어서 트리 집합에 삽입하고 작성자 순서가 중요하지 않도록 equals 메서드를 만들었습니다. `

public class CoAutoria implements Comparable<CoAutoria> 
{  
private Autor autor1; 
private Autor autor2; 
private int artigosComum; 
(...) 
} 


@Override 
public int compareTo(CoAutoria a2) 
{ 
    String thisAutor1 = autor1.getNome(); 
    String thisAutor2 = autor2.getNome(); 
    String caAutor1 = a2.getAutor1().getNome(); 
    String caAutor2 = a2.getAutor2().getNome(); 
    if((autor1.equals(a2.getAutor1()) && autor2.equals(a2.getAutor2())) || (autor1.equals(a2.getAutor2()) && autor2.equals(a2.getAutor1()))) 
    { 
     return 0; 
    } 
    else 
    {    

     return 1; 
    }   
}  
@Override 
public boolean equals(Object o) 
{ 
    if(this == o) 
    { 
     return true; 
    } 


    if(o == null || o.getClass() != this.getClass()) 
     return false; 

    CoAutoria ca = (CoAutoria) o; 
    String thisAutor1 = autor1.getNome(); 
    String thisAutor2 = autor2.getNome(); 
    String caAutor1 = ca.getAutor1().getNome(); 
    String caAutor2 = ca.getAutor2().getNome(); 
    if((thisAutor1.equals(caAutor1) && thisAutor2.equals(caAutor2)) || (thisAutor1.equals(caAutor2) && thisAutor2.equals(caAutor1))) 
    { 
     return true; 
    } 
    else 
    {    
     return false; 
    } 

} 

주요 문제는 다음과 같습니다 : 나는 세트가 이미 'CoAutoria'의 특정 인스턴스가 있는지 확인하면, (나는 TreeSet에의 포함() 메소드를 사용하고

여기에 주요 코드는), 그것은 나에게 잘못된 결과를 준다 ... 때로는 페어 AB가 (BA의 형태로) 그 세트에 이미 존재한다는 것을 정확하게 검사하지만 때로는 그렇지 않다. ... 내가 읽은 것에 대해, equals 메서드는 그렇게할만한 것이 아닙니다. 맞습니까?

[편집 :] 는 첫 번째 게시물 이후로 나는 어쩌면 문제는 내가

public int compareTo(CoAutoria a2) 
{ 
String thisAutor1 = autor1.getNome(); 
String thisAutor2 = autor2.getNome(); 
String caAutor1 = a2.getAutor1().getNome(); 
String caAutor2 = a2.getAutor2().getNome(); 
if(this.equals(a2)) 
{ 
    System.out.println("return 0"); 
    return 0; 
} 
else 
{    
    int aux = thisAutor1.compareTo(caAutor1); 
    if(aux != 0) 
    { 
     return aux; 

    } 
    else 
    { 
     return thisAutor2.compareTo(caAutor2); 

    } 

}   

}

로 변경하지만 여전히 내 나쁜주는 compareTo..So에 거주 있다고 생각하기 시작 결과 ... 나는 지금 생각했다. 만약 그것이 같은 'CoAutoria'라면, 나는 0을 반환하고, 그렇지 않다면 나는 compareTo 값으로 주문한다. 그러나 뭔가가 빠져있다.

+0

예를 들어 설명 할만큼 충분하지는 않지만 ... contains를 사용하는 대신 loop through를 사용하면 equals()를 사용한 테스트가 작동하지 않을 수도 있습니다. –

+1

@DariusX. 문제는 그의 equals와는 다르다. compareTo 함수를 사용하고있다. compareTo 함수가 제대로 작동하지 않으면 정렬 된 컬렉션에 대해'contains' 메서드도 작동하지 않습니다. – greedybuddha

답변

2

contains 방법이 깨지기 때문에 compareTo 메서드는 항상 0 또는 양수를 반환하며 음수는 반환하지 않습니다. 즉, compareTo이 일치하지 않습니다. 저자가 동일한 경우 올바른 구현은 0을 반환하고 저자가 다를 경우 긍정 값은 및 음수가입니다.

예 (author1를 가정하는 것은 author2 다릅니다) : 너의이, 위의 두 경우 모두에 대한 1를 반환하는 요소 이제까지 smaller 없기 때문에 주문 컬렉션이 작동하지 만들 것이다

int i = author1.compareTo(author2); // i should be positive or negative 
int j = author2.compareTo(author1); // j should be the opposite of i 

. 다른 예를 들어 [1-10] 요소를 가진 이진 트리 (순서가 지정된 컬렉션)가 있다고 가정 해보십시오. 엘리먼트 5를 찾고 있다면, 엘리먼트와 5를 비교했을 때의 바이너리 트리가 항상 같거나 더 큼다고 말할 것입니다.

정확하게 바꾸는 방법은 당신에게 달려 있습니다. 그러나 아이디어는 저자를 이름순으로 정렬 한 다음 두 컬렉션을 반복하고 저자를 사전 식으로 비교하는 것입니다.

편집 : 수정 한 후에도 메소드에 여전히 일관성이 없습니다. 다음을 시도해보십시오. 가장 효율적인 것은 아니지만 실제로 속도를 최적화하고 싶지 않으면 작동해야합니다. 먼저 정렬 된 다른 CoAutor과 비교되기 전에 author1과 author2가 순서대로 정렬되도록 먼저 정렬합니다. 나는 null 검사를하지 않으며 둘 다 유효한 저자라고 가정합니다.

@Override 
public boolean equals(Object o){ 
    if (o == null || !(o instanceof CoAutoria)) return false; 
    if (o == this) return true; 
    return this.compareTo((CoAutoria)o) == 0; 
} 

@Override 
public int compareTo(CoAutoria o) { 
    List<String> authors1 = Arrays.asList(autor1.getNome(), autor2.getNome()); 
    List<String> authors2 = Arrays.asList(o.autor1.getNome(), o.autor2.getNome()); 
    Collections.sort(authors1); 
    Collections.sort(authors2); 
    for (int i=0;i<authors1.size();i++){ 
     int compare = authors1.get(i).compareTo(authors2.get(i)); 
     if (compare != 0) 
      return compare; 
    } 
    return 0; 
} 
+0

답장을 보내 주셔서 감사합니다. 내 compareTo 메서드를 개선하려고 시도했지만 (초기 게시물을 편집했습니다) 여전히 어떤 종류의 오류가 발생하고 있습니다. –

+0

수정 된 답변을 확인하십시오. 당신의 방법은 여전히 ​​잘못되어 있으므로 제가 제안한 것을 시도하십시오. – greedybuddha

+0

그래, 그냥 지금 내 쌍이 똑같은 방식으로 주문하지 않으면 내가 만든 방법을 사용할 수 없다는 것을 알았다. 고마워! 필자는 'CoAutoria'의 인스턴스를 생성하면서 저자에게 주문할 수있는 또 다른 솔루션을 제공합니다. 그러나 내가 할 수없는 상황에서, 당신의 방법은 더 유용 할 것이다 :) –