122 votes

Le moyen le plus efficace de mettre le premier caractère d'une chaîne en minuscule ?

Quelle est la manière la plus efficace de faire en sorte que le premier caractère d'un fichier String minuscules ?

Je peux penser à un certain nombre de façons de le faire :

Utilisation de charAt() avec substring()

String input   = "SomeInputString";
String output  = Character.toLowerCase(input.charAt(0)) +
                   (input.length() > 1 ? input.substring(1) : "");

Ou en utilisant un char tableau

 String input  = "SomeInputString";
 char c[]      = input.toCharArray();
 c[0]          = Character.toLowerCase(c[0]);
 String output = new String(c);

Je suis sûr qu'il existe de nombreux autres moyens d'y parvenir. Que recommandez-vous ?

0 votes

Le mieux serait de modifier vos exigences si possible. Acceptez un StringBuilder au lieu d'un String et vous pourrez le modifier directement.

0 votes

Ce n'est pas une réponse parce que c'est en dehors de Java, et que cela repose sur l'encodage ASCII et sur le fait de savoir que le caractère est déjà alphabétique. C'est une astuce de vieux briscard : c[0] |= ' ';

0 votes

103voto

Daniel Pacak Points 494

Je suis tombé sur une alternative intéressante si vous ne voulez pas utiliser une bibliothèque tierce :

import java.beans.Introspector;

Assert.assertEquals("someInputString", Introspector.decapitalize("SomeInputString"));

18 votes

Extrait de la doc de cette méthode : "Cela signifie normalement convertir le premier caractère de la majuscule à la minuscule, mais dans le cas spécial (inhabituel) où il y a plus d'un caractère et où le premier et le deuxième sont tous deux en majuscule, nous le laissons tranquille."

1 votes

De plus, en regardant la source, une fois que cette méthode gère le cas spécial que j'ai décrit dans le commentaire précédent, elle utilise simplement le tableau de chars comme je l'avais mentionné dans ma question.

3 votes

Exactement ce dont j'avais besoin. Introspector.decapitalize("ABC") sera toujours ABC. WordUtils.uncapitalize("ABC") produit "aBC". Je vous signale simplement que c'est de cette façon que Spring nomme automatiquement les beans, donc si vous avez besoin de récupérer le ABCService par son nom, ce n'est pas aBCService, mais ABCService.

23voto

Carlos Tasada Points 3629

Pour ce qui est de la manipulation des chaînes de caractères, jetez un coup d'œil à Jakarta Commons Lang. StringUtils .

8 votes

Plus précisément, la méthode uncapitalize(java.lang.String) utilisant StringUtils a l'avantage supplémentaire de ne pas avoir à se soucier des NullPointerExceptions dans votre code.

3 votes

Pas nécessairement le plus efficace, mais peut-être le plus clair, ce qui compte beaucoup.

2 votes

Cela dépend de la ressource que vous voulez rendre plus efficace - le CPU ou le temps du programmeur :)

20voto

Sebastian Points 11

Si vous souhaitez utiliser Apache Commons, vous pouvez procéder comme suit :

import org.apache.commons.lang3.text.WordUtils;
[...] 
String s = "SomeString"; 
String firstLower = WordUtils.uncapitalize(s);

Résultat : someString

3 votes

C'est une solution agréable et propre, mais elle est maintenant dépréciée, nous devrions utiliser les commons-text's : compile group: 'org.apache.commons', name: 'commons-text', version: '1.2'

10voto

Michael Konietzka Points 3007

Malgré une approche axée sur les caractères, je suggère une solution axée sur les chaînes. String.toLowerCase est spécifique à une localité, je prendrais donc cette question en compte. String.toLowerCase est à privilégier pour les minuscules selon Character.toLowerCase . De plus, une solution orientée char n'est pas totalement compatible avec l'unicode, car Character.toLowerCase ne peut pas gérer les caractères supplémentaires.

public static final String uncapitalize(final String originalStr,
            final Locale locale) {
        final int splitIndex = 1;
        final String result;
        if (originalStr.isEmpty()) {
        result = originalStr;
        } else {
        final String first = originalStr.substring(0, splitIndex).toLowerCase(
                locale);
        final String rest = originalStr.substring(splitIndex);
        final StringBuilder uncapStr = new StringBuilder(first).append(rest);
        result = uncapStr.toString();
        }
        return result;
    }

UPDATE : Pour illustrer l'importance du paramètre de la locale, mettons en minuscule I en turc et en allemand :

System.out.println(uncapitalize("I", new Locale("TR","tr")));
System.out.println(uncapitalize("I", new Locale("DE","de")));

produira deux résultats différents :

i

7voto

Alan Geleynse Points 11842

Les chaînes de caractères en Java sont immuables, donc dans tous les cas, une nouvelle chaîne sera créée.

Votre premier exemple sera probablement légèrement plus efficace car il ne nécessite que la création d'une nouvelle chaîne de caractères et non d'un tableau de caractères temporaire.

1 votes

En fait, la première méthode crée une chaîne temporaire (pour la sous-chaîne), ce qui est plus coûteux que le tableau de caractères.

1 votes

Inutile sans données à l'appui

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X