it-swarm.com.de

Lexikographische Reihenfolge in Java

Wie ist die lexikographische Reihenfolge in Java definiert, insbesondere in Bezug auf Sonderzeichen wie !, . usw.?

Eine Musterbestellung finden Sie hier

Aber wie definiert Java seine Reihenfolge? Ich frage, weil ich Strings auf Java und Oracle sortiere und andere Ergebnisse bekomme und die Spezifikation für die lexikographische Reihenfolge nicht finden kann.

11
oschrenk

Aus den Dokumenten für String.compareTo :

Vergleicht zwei Zeichenketten lexikographisch. Der Vergleich basiert auf dem Unicode-Wert jedes Zeichens in den Zeichenfolgen.

und 

Dies ist die Definition der lexikographischen Reihenfolge. Wenn zwei Zeichenfolgen unterschiedlich sind, haben sie entweder unterschiedliche Zeichen an einem Index, der ein gültiger Index für beide Zeichenfolgen ist, oder ihre Länge ist unterschiedlich oder beide. Wenn sie an einer oder mehreren Indexpositionen unterschiedliche Zeichen haben, sei k der kleinste Index dieser Art; dann geht die Zeichenfolge, deren Zeichen an Position k den kleineren Wert hat, wie mit dem Operator <bestimmt, der anderen Zeichenfolge lexikographisch voraus. In diesem Fall gibt compareTo die Differenz der beiden Zeichenwerte an Position k in der beiden Zeichenfolge [...] zurück.

Im Grunde behandelt es jeden String wie eine Folge von vorzeichenlosen 16-Bit-Ganzzahlen. Kein kulturelles Bewusstsein, kein Verständnis für zusammengesetzte Charaktere usw. Wenn Sie eine komplexere Sortierung wünschen, sollten Sie Collator betrachten.

24
Jon Skeet

In Java basiert es auf dem Unicode-Wert der Zeichenfolge:

http://download.Oracle.com/javase/1.4.2/docs/api/Java/lang/String.html#compareTo(Java.lang.String )

In Oracle hängt es von dem Zeichensatz ab, den Sie in Ihrer Datenbank verwenden. Es soll UTF-8 sein, um konsistentes Verhalten mit Java zu haben.

So überprüfen Sie den Zeichensatz:

SQL> SELECT parameter, value FROM nls_database_parameters 
     WHERE parameter = 'NLS_CHARACTERSET';

PARAMETER             VALUE 
------------------    ---------------------
NLS_CHARACTERSET      UTF8

Wenn es sich nicht um UTF-8 handelt, können Sie abhängig vom Zeichensatz Ihrer Oracle-Datenbank ein anderes Vergleichsverhalten erhalten.

7
user468687

aus den javadocs :

Der Vergleich basiert auf dem Unicode-Wert jedes Zeichens in den Zeichenfolgen.

genauer: 

Dies ist die Definition der lexikographischen Reihenfolge. Wenn zwei Zeichenfolgen sind anders, dann Entweder haben sie unterschiedliche Zeichen an einem Index, der für beide gültig ist Strings oder ihre Länge sind unterschiedlich oder beide. Wenn sie unterschiedliche Zeichen haben an einer oder mehreren Indexpositionen sei k der kleinste Index dieser Art; dann die Zeichenfolge, deren Zeichen an Position k hat den kleineren Wert, der mit dem Operator <, __, bestimmt wird. lexikographisch geht der andere String voran. In diesem Fall liefert compareTo die Differenz der beiden Zeichenwerte an Position k in der beiden Zeichenfolge ...

2
amit

Hoffe das hilft!!

Mitarbeiter sortiert nach absteigender Reihenfolge der Bewertung und wenn zwei verschiedene Mitarbeiter dieselbe Bewertung haben, müssen wir den Mitarbeiternamen für die lexikografische Sortierung berücksichtigen.

Implementierung der Mitarbeiterklasse: (Verwendete Comparable-Schnittstelle für diesen Fall.)

@Override
public int compareTo(Object obj) {
    Employee emp = (Employee) obj;

    if(emp.getScore() > this.score) return 1;
    else if(emp.getScore() < this.score) return -1;
    else
        return emp.getEmpName().compareToIgnoreCase(this.empName) * -1;
}
0
Nivas C.T.