2012-04-05 64 views
1

我正在實現一種左邊最小堆的形式,它按長度存儲任意單詞。所以,我寫了掃描儀的包裝類,並改變了的compareTo,像這樣compareTo和使用掃描器的字符串

public class ScannerWrapper implements Comparable<String> 

//a Scanner, sc and a String, current 
public int compareTo(String str){ 
    if(current.length() > str.length()) return -1; 
    if(current.length() > str.length()) return 1; 
    else return 0; 
} 

其中電流= sc.next(),而不是\ n字符。在這種情況下,如果我有ScannerWrapper.next()> foo,其中foo是任意長度的字符串> ScannerWrapper.next();如果我有ScannerWrapper.next()
它會使用我寫的compareTo(String),返回false,還是會做一些其他的隨機事件?

+0

對不起,如果我的解釋似乎混亂。讓我試着澄清 - '字符串n = ScannerWrapper.next()和n.length()> foo.length() – 2012-04-05 04:21:42

+1

我無法真正理解您的問題,但是您的'if'語句條件都是相同... – AusCBloke 2012-04-05 04:26:01

+0

您是否在compareTo方法的第二次比較中使用了一個「<」? – Raze 2012-04-05 05:28:54

回答

0

幾次閱讀您的問題後,我想我明白您現在要問什麼。如果您試圖比較類ScannerWrapper的兩個實例與比較運算符,那麼不,它不起作用。

您不能在Java中重載運算符(您可以使用C++),因此爲了比較ScannerWrapper與其他對象的實例,您將不得不調用compareTo()方法。

此外,您的if聲明條件是相同的,所以您可能需要解決這個問題。

+0

我從來不使用精確的轉錄本我的代碼放在這裏,我儘量讓它們儘可能通用。就像這樣,像if語句這樣的錯誤是可能的,謝謝你的注意。 所以,我應該比較類ScannerWrapper的兩個實例?假設我有一個字符串長度N,它是流中的下一個單詞,並且我的最小堆中的字符串長度爲i 2012-04-05 12:38:23

+0

@SamP:您可以比較一個'ScannerWrapper'和'String'或兩個'ScannerWrapper's,這取決於您以及您如何編寫重載的compareTo()方法。您可以使用'compareTo()'來確定當前值應該在最小堆中的哪個位置,但是我猜你的堆會存儲'String'或'ScannerWrapper's,所以我可能期望兩個相同類型的對象相互比較。 – AusCBloke 2012-04-05 22:06:34

+0

min-heap會存儲字符串,所以也許我應該寫一個包裝一個字符串並擁有一個獨立掃描器的類? – 2012-04-06 09:52:37

0

很難理解你的問題 - 所以你可能會考慮改寫它。這裏有一個在黑暗中拍攝:

public class ScannerWrapper implements Comparable<ScannerWrapper> 

    //your wrapper has a handle to the scanned data. Presumably it's 
    //initialized on construction, which is omitted here 
    private final String scannedData;   

    public String getScannedData() { 
     return this.scannedData; 
    } 

    public int compareTo(ScannerWrapper other) { 
     //if this scannedData is longer than the other, return 1 
     if(this.str.length() > other.getStr().length()) { 
      return 1; 
     } else if(this.scannedData.length() < other.getScannedData().length()) { 
     //if the other scannedData is longer return -1 
      return -1; 
     } 
     //if they are equal return 0 
     return 0; 
    } 

}