10 Stimmen

Ersetzen des ersten Buchstabens eines Strings in Java?

Ich versuche, den ersten Buchstaben einer Zeichenkette in Kleinbuchstaben zu konvertieren.

value.substring(0,1).toLowerCase() + value.substring(1)

Das funktioniert, aber gibt es noch bessere Möglichkeiten, dies zu tun?

Ich könnte eine Ersetzungsfunktion verwenden, aber Java's replace akzeptiert keinen Index. Sie müssen das eigentliche Zeichen/die Teilzeichenkette übergeben. Es könnte so gemacht werden:

value.replaceFirst(value.charAt(0), value.charAt(0).toLowerCase())

Außer, dass replaceFirst 2 Zeichenketten erwartet, so dass die value.charAt(0) s müssten wahrscheinlich ersetzt werden durch value.substring(0,1) .

Gibt es eine Standardmethode, um den ersten Buchstaben eines Strings zu ersetzen?

1 Stimmen

12voto

Maxym Punkte 11736

Ich empfehle Ihnen, einen Blick auf folgende Seiten zu werfen Commons-Lang Bibliothek von Apache. Sie haben eine Klasse

StringUtils

mit dem man eine Menge Aufgaben mit Strings erledigen kann. In Ihrem Fall verwenden Sie einfach

StringUtils.uncapitalize( value )

Lesen Sie hier über uncapitalize sowie über andere Funktionen der Klasse vorgeschlagen

Hinzugefügt: Meine Erfahrung sagt, dass Coomon-Lang ziemlich gut optimiert ist. Wenn Sie also wissen wollen, was aus algorithmischer Sicht besser ist, können Sie sich den Quellcode von Apache ansehen.

3voto

T.J. Crowder Punkte 948310

Der Nachteil des Codes, den Sie verwendet haben (und den ich in ähnlichen Situationen verwendet habe), ist, dass er etwas klobig erscheint und theoretisch mindestens zwei temporäre Zeichenfolgen erzeugt, die sofort weggeworfen werden. Außerdem stellt sich die Frage, was passiert, wenn Ihre Zeichenkette weniger als zwei Zeichen lang ist.

Der Vorteil ist, dass Sie diese temporären Zeichenketten nicht außerhalb des Ausdrucks referenzieren (was eine Optimierung durch den Bytecode-Compiler oder den JIT-Optimierer zulässt) und dass Ihre Absicht für jeden zukünftigen Code-Maintainer klar ist.

Es sei denn, Sie müssen in jeder Sekunde mehrere Millionen dieser Aufgaben erledigen y Wenn ich dabei ein spürbares Leistungsproblem feststelle, würde ich mir keine Sorgen um die Leistung machen und lieber Klarheit schaffen. Ich würde es auch irgendwo in einer Utility-Klasse vergraben :-) Siehe auch jambjos Antwort auf eine andere Antwort, die darauf hinweist, dass es einen wichtigen Unterschied gibt zwischen String#toLowerCase y Character.toLowerCase . ( Edit: Die Antwort und damit der Kommentar wurden entfernt. Im Grunde gibt es einen großen Unterschied in Bezug auf Gebietsschemata und Unicode und die Dokumentation empfiehlt die Verwendung von String#toLowerCase ではなく Character.toLowerCase ; mehr hier . )

bearbeiten Da ich in einer komischen Stimmung bin, dachte ich, ich schaue mal, ob es einen messbaren Unterschied in der Leistung in einem einfachen Test gibt. Den gibt es. Es könnte an den lokalen Unterschieden liegen (z.B. Äpfel vs. Orangen):

public class Uncap
{
    public static final void main(String[] params)
    {
        String  s;
        String  s2;
        long    start;
        long    end;
        int     counter;

        // Warm up
        s = "Testing";
        start = System.currentTimeMillis();
        for (counter = 1000000; counter > 0; --counter)
        {
            s2 = uncap1(s);
            s2 = uncap2(s);
            s2 = uncap3(s);
        }

        // Test v2
        start = System.currentTimeMillis();
        for (counter = 1000000; counter > 0; --counter)
        {
            s2 = uncap2(s);
        }
        end = System.currentTimeMillis();
        System.out.println("2: " + (end - start));

        // Test v1
        start = System.currentTimeMillis();
        for (counter = 1000000; counter > 0; --counter)
        {
            s2 = uncap1(s);
        }
        end = System.currentTimeMillis();
        System.out.println("1: " + (end - start));

        // Test v3
        start = System.currentTimeMillis();
        for (counter = 1000000; counter > 0; --counter)
        {
            s2 = uncap3(s);
        }
        end = System.currentTimeMillis();
        System.out.println("3: " + (end - start));

        System.exit(0);
    }

    // The simple, direct version; also allows the library to handle
    // locales and Unicode correctly
    private static final String uncap1(String s)
    {
        return s.substring(0,1).toLowerCase() + s.substring(1);
    }

    // This will *not* handle locales and unicode correctly
    private static final String uncap2(String s)
    {
        return Character.toLowerCase(s.charAt(0)) + s.substring(1);
    }

    // This will *not* handle locales and unicode correctly
    private static final String uncap3(String s)
    {
        StringBuffer sb;

        sb = new StringBuffer(s);
        sb.setCharAt(0, Character.toLowerCase(sb.charAt(0)));
        return sb.toString();
    }
}

Ich habe die Reihenfolge in verschiedenen Tests durcheinander gebracht (indem ich sie verschoben und neu kompiliert habe), um Probleme mit der Anlaufzeit zu vermeiden (und habe anfangs trotzdem versucht, einige zu erzwingen). Sehr unwissenschaftlich, aber uncap1 war durchweg langsamer als uncap2 y uncap3 um etwa 40 %. Nicht, dass das wichtig wäre, wir reden hier von einem Unterschied von 400 ms bei einer Million Iterationen auf einem Intel Atom Prozessor :-)

Also: Ich würde Ihren einfachen, geradlinigen Code verwenden, der in eine Utility-Funktion verpackt ist.

1voto

Russell Leggett Punkte 8485

Achten Sie auf alle Zeichenfunktionen in Zeichenketten. Aufgrund von Unicode, ist es nicht immer eine 1 zu 1 Zuordnung. Halten Sie sich an String-basierte Methoden, es sei denn, char ist wirklich das, was Sie wollen. Wie bereits von anderen vorgeschlagen, gibt es String-Utilities, aber selbst wenn Sie diese nicht für Ihr Projekt verwenden wollen, erstellen Sie sich einfach selbst eine, während Sie arbeiten. Das Schlimmste, was Sie tun können, ist, eine spezielle Funktion für Kleinbuchstaben zu erstellen und sie in einer Klasse zu verstecken, um dann denselben Code leicht abgewandelt an 12 verschiedenen Stellen zu verwenden. Legen Sie ihn irgendwo ab, wo er leicht weitergegeben werden kann.

1voto

Marcus Leon Punkte 52789

Utilisez StringBuffer :

buffer.setCharAt(0, Character.toLowerCase(buffer.charAt(0)));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X