2012-04-05 7 views
1

Ich implementiere eine Form der linken Min-Heap, die willkürliche Wörter nach Länge speichert. Also, ich habe eine Wrapper-Klasse für Scanner geschrieben und geändert, um die compareTo, wie socompareTo und Strings mit einem Scanner

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; 
} 

wo Strom = sc.next() und nicht das Zeichen \ n ist.

in diesem Fall, wenn ich ScannerWrapper.next()> foo, wo foo ist eine beliebige Zeichenfolge der Länge> ScannerWrapper.next();
wird es die compareTo (String) verwenden, die ich geschrieben habe, falsch zurückgegeben, oder wird es irgendeine andere zufällige Sache tun?

+0

Sorry, wenn meine Erklärung verwirrt scheint. Lassen Sie mich versuchen zu klären - 'String n = ScannerWrapper.next() und n.length()> foo.length() –

+1

Ich kann Ihre Frage nicht wirklich gut verstehen, aber Ihre beiden 'if'-Bedingungen sind die selbe ... – AusCBloke

+0

Wollten Sie ein '<' im zweiten Vergleich in der compareTo-Methode verwenden? – Raze

Antwort

0

Nachdem ich Ihre Frage mehrmals gelesen habe, denke ich, dass ich verstehe, was Sie jetzt fragen. Wenn Sie versuchen, zwei Instanzen der Klasse ScannerWrapper mit den Vergleichsoperatoren zu vergleichen, dann wird es nicht funktionieren.

Sie können die Operatoren in Java nicht überladen (Sie können in C++), daher müssen Sie die ScannerWrapper-Methode miteinander vergleichen, um Instanzen von ScannerWrapper miteinander zu vergleichen.

Auch beide Statement-Bedingungen if sind die gleichen, so dass Sie das beheben möchten.

+0

Ich benutze nie genaue Transkripte von Mein Code hier, ich versuche, sie so allgemein wie möglich zu machen. Wie es der Fall ist, sind Lights wie die if-Statements möglich, danke fürs Bemerken. Also, ich sollte zwei Instanzen der Klasse ScannerWrapper vergleichen? Angenommen, ich habe eine Stringlänge N, die das nächste Wort im Stream ist, und eine Stringlänge i

+0

@SamP: Sie können einen 'ScannerWrapper' und einen' String' oder zwei 'ScannerWrapper' vergleichen, es liegt an Ihnen und wie Sie Ihre überladenen' compareTo() 'Methoden kodieren. Sie würden 'compareTo()' verwenden, um zu bestimmen, wo im Min-Heap ein aktueller Wert liegen soll, aber ich nehme an, Ihr Heap würde entweder 'String's oder' ScannerWrapper' speichern, so dass ich wahrscheinlich zwei davon erwarten würde gleiche Art von Objekten, die miteinander verglichen werden. – AusCBloke

+0

Der Min-Heap würde Strings speichern, also sollte ich vielleicht eine Klasse schreiben, die einen String umschließt und einen separaten Scanner hat? –

0

Es ist schwierig, Ihre Frage zu verstehen - Sie sollten sie vielleicht neu formulieren. Hier ist ein Schuss in die Dunkelheit:

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; 
    } 

}