2012-02-04 58 views
3

我想通過編寫我自己的和使用類似的工具覆蓋java中的默認compareTo()方法,但似乎java仍然使用默認方法。compareTo()方法在使用Comparable接口時不覆蓋默認方法

我想從一個.dat文件中獲取長度的字符串數組,但它通過字母順序來代替它。我會很感激,如果有人能告訴我我做錯了什麼,因爲我無法弄清楚爲什麼這不起作用。

感謝

import static java.lang.System.*; 
import java.util.Arrays; 

public class Word implements Comparable 
{ 
private String word; 
private String[] array; 

public Word() 
{ 
    word = ""; 
} 

public Word(String s) 
{ 
    word = s; 
} 

public void setWord(String s) 
{ 
    word = s; 
} 

public int compareTo(String rhs) 
{ 
    String temp = (String)rhs; 
    if(word.length() > temp.length()) 
     return 1; 
    else if(word.length() < temp.length()) 
     return -1; 

    return 0; 
} 

public void setSize(int size) 
{ 
    array = new String[size]; 
} 

public void add(int spot, String other) 
{ 
    array[spot] = other; 
} 

public String[] sortByLength() 
{ 
    Arrays.sort(array); 
    return array; 
} 
public String toString() 
{ 
    return Arrays.toString(array); 
} 
} 

這裏是包含的主要方法

import java.io.File; 
import java.io.IOException; 
import java.util.Scanner; 
import java.util.Arrays; 
import static java.lang.System.*; 

public class Lab18d 
{ 
public static void main(String args[]) throws IOException 
{ 
    Scanner file = new Scanner(new File("lab18d.dat")); 

    int size = file.nextInt(); 
    file.nextLine(); 
    Word test = new Word(); 
    test.setSize(size); 
    String word = ""; 

    for(int i = 0; i < size; i++) 
    { 
     word = file.next(); 
     test.setWord(word); 
     test.add(i, word); 
    } 
    test.sortByLength(); 
    System.out.println(test); 
} 
} 

回答

0

短的類版本:您需要使用Arrays.sort method taking a Comparator代替。

長版:該生產線

Arrays.sort(array); 

sortByLength方法保持調用它的排序對象compareTo方法 - 和這些對象都是字符串!相反,你需要行

Arrays.sort(array, new Comparator<String>() { 
    @Override 
    public int compare(String s1, String s2) { 
     if (s1.length() > s2.length()) 
      return 1; 
     if (s1.length() < s2.length()) 
      return -1; 

     return 0; 
    } 
}); 

,或者可以創建一個單獨的類實現Comparator<String>和使用的某個實例作爲第二個參數來Arrays.sort

+0

哇,我很困惑,它和班上其他代碼的上下文完全吻合。我敢肯定,如果我把所有的代碼放在一行代碼中,那麼這將不起作用: Arrays.sort(array); – 2012-02-04 04:45:02

+0

爲什麼不呢?這是一個匿名類的例子,你可以在http://en.wikibooks.org/wiki/Java_Programming/Nested_Classes#Anonymous_Classes – 2012-02-04 04:47:28

+0

找到一個匿名類的例子。嗯,我試着複製你寫的代替數組的.sort(數組);它給了我43個錯誤。 – 2012-02-04 04:55:26

1

檢查compareTo方法here

的簽名應該是int compareTo(Object o)

和你給public int compareTo(String rhs)

您還可以添加註釋@Override你的方法。它會讓你知道你是否沒有遵循正確的簽名。

+0

您的鏈接指向Java 1.4文檔,這是在泛型添加到該語言之前編寫的。如果您檢查http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html上的Java 6文檔,您將看到類中'compareTo'方法的正確簽名實現'Comparable '確實是'public int compareTo(String rhs)'。也就是說,發佈的代碼實現原始的「Comparable」而不是「Comparable 」,這是令人不悅的。 – 2012-02-04 04:23:24

3

幫你一個忙:每次你重寫一個方法時,給它添加@Override註解。如果你在重寫方法時犯了一個錯誤,這將會給你一個編譯錯誤,這就是發生在這裏的事情。你實現它錯了,因爲Comparable(「原始」形態的Comparable<T>未聲明的方法compareTo(String),它聲明的方法compareTo(Object)

得到它的原樣進行編譯,您將需要接受Object而不是String或實現Comparable<String>代替Comparable

但是,這真的會在大多數情況下不正確的,因爲這樣的比較是不對稱的:你可以將Word比較字符串而不是一個字符串的話

最有可能你想實施Comparable<Word>而不是Comparable並接受WordcompareTo()

@Override 
public int compareTo(Word other) 
{ 
    String temp = other.word; 
    //... 
} 

不過,請注意Comparable僅僅是一個很好的配合,當一個類型是本質排序(什麼文檔所說的「自然秩序」),如日期或數字。由於實際上並未按字母順序比較這兩個單詞(這將最接近字符串的自然順序),因此使用外部比較器會更好。

//since Word.word is a private member, this either needs to be nested inside of Word 
//or Word.word would need to be given an accessor method 
public static class LengthComparator implements Comparator<Word> { 
    @Override 
    public int compare(Word word1, Word word2) { 
     return Integer.valueOf(word1.word.length()).compareTo(word2.word.length()); 
    } 
} 
2

Comparable被輸入,但您使用的原始類型。試試這個:

public class Word implements Comparable<Word> { // Note: typing of Comparable 
    ... 

    public int compareTo(Word rhs) { // Note: parameter is typed 
     String temp = rhs.word; 
     return word.length() - temp.length(); // Note: Simplification of code 
    } 
} 
+0

這仍然不能解決'sortByLength'方法正在排序字符串列表而不是'Word'對象列表的事實。 – 2012-02-04 04:28:58

+0

我做了這些改變,它編譯得很好(像以前一樣),但它仍然按字母順序對數組進行排序。 – 2012-02-04 04:39:36