2017-11-03 4 views
-1

Ich habe Probleme mit der Kompilierung, die ich nicht verstehe und würde einige Hilfe zu schätzen wissen. Auszug aus dem Code, sind andere Verfahren zur Kürze weggelassen:Collections.sort mit Comparator <String[]> kompilieren Fehler

public class TableBuilder { 
    List<String[]> rows = new LinkedList<String[]>(); 

    public void sortByColumn(final int colIndex) { 
    int maxIdx = 0; 
    for (String[] s : rows) maxIdx = Math.max(maxIdx, s.length - 1); 
    if (colIndex < 0 || colIndex >= maxIdx) return 

    Collections.sort(rows, new Comparator<String[]>() { 
     @Override 
     public int compare(String[] strings, String[] otherStrings) { 
      return strings[colIndex].compareTo(otherStrings[colIndex]); 
     } 
    }); 
    } 

}

Fehler, die ich erhalte ist:

cannot return a value from method whose result type is void 
       Collections.sort(rows ,new Comparator<String[]>() { 
           ^

Wenn ich Methodensignatur public int sortByColumn(final int colIndex) ändern dann ich Störung erhalte :

incompatible types 
found : void 
required: int 
       Collections.sort(rows, new Comparator<String[]>() { 
           ^

Warum dieser Code nicht kompiliert e und wie ist return in anonymous Comparator Klasse im Zusammenhang mit sortByColumn Signatur? Ist es möglicherweise Compiler Bug oder was mache ich falsch? Verwenden von javac 1.6.0_45.

+2

Typo: 'if (colIndex <0 || colIndex> = maxIdx) return'. Fügen Sie ';' ein, um die Anweisung abzuschließen. Überprüfen Sie immer Ihren gesamten Code, nicht nur die vom Compiler hervorgehobene Zeile. – BackSlash

+0

Und immer Klammern um Ihre if/while/für Blöcke verwenden. Noch ein Fehler, der einfacher zu diagnostizieren wäre, wenn Sie geschweifte Klammern verwendet hätten. –

+0

Dies ist ein Tippfehler, ich glaube, das könnte knapp sein. – AxelH

Antwort

0

Ich schlage vor, die return Aussage zu entfernen, so dass der Code kompiliert:

public class TableBuilder { 
    List<String[]> rows = new LinkedList<String[]>(); 

    public void sortByColumn(final int colIndex) { 
     int maxIdx = 0; 
     for (String[] s : rows) maxIdx = Math.max(maxIdx, s.length - 1); 
     if (colIndex < 0 || colIndex >= maxIdx) { 
      Collections.sort(rows, new Comparator<String[]>() { 
       @Override 
       public int compare(String[] strings, String[] otherStrings) { 
        return strings[colIndex].compareTo(otherStrings[colIndex]); 
       } 
      }); 
     } 
    } 
} 

Die Collections.sort Methode, um die rows Sammlung als veränderbares Objekt sortieren wird. Eine sortierte Auflistung wird nicht als neues Objekt zurückgegeben.

1

Ihr Vergleicher ist in Ordnung. Das Problem ist, dass Sie versuchen, return das Ergebnis Comparator#sort, die eine void ist. Nur verlieren die return Aussage und Sie sollten in Ordnung sein:

if (colIndex > 0 && colIndex <= maxIdx) { 
    Collections.sort(rows, new Comparator<String[]>() { 
     @Override 
     public int compare(String[] strings, String[] otherStrings) { 
      return strings[colIndex].compareTo(otherStrings[colIndex]); 
     } 
    }); 
} 
+0

scheint eine Überprüfung zu sein, um den 'colIndex' Wert zu validieren. Also sollte es zurückkommen oder sonst die Sortierung;) – AxelH

0

Das Tippfehler war wie hervorgehoben durch Backslash

Verwandte Themen