Quelle méthode de capitalisation est meilleure?
Mine: p>
return new StringBuffer(strLen) .append(Character.toTitleCase(str.charAt(0))) .append(str.substring(1)) .toString();
11 Réponses :
Avez-vous chronométré à la fois? P>
Honnêtement, ils sont équivalents .. donc celui qui fonctionne mieux pour vous em> strud> est le meilleur :) p>
Méfiez-vous que les caractéristiques de langue de référence sont très difficiles en Java, voir ce très bon article de Brian Goetz: ibm.com/developerworks/java/library/j-jtp12214/...
Notez également que les résultats peuvent varier en fonction de la longueur de la chaîne.
Stringbuffer CODE> est déclaré être le fil sûr, il peut donc être moins efficace de l'utiliser (mais il ne faut pas y parier avant de faire des tests pratiques). P>
Je suppose que votre version sera un peu plus performante, car elle n'alloit pas autant d'objets à chaîne temporaire.
J'irais pour cela (en supposant que la chaîne n'est pas vide): P>
character uppercase titlecase --------- --------- --------- dz DZ Dz
Pourriez-vous s'il vous plaît fournir plus de détails sur la différence entre Touppercase () et Totitlecase ()?
Le code Apache a probablement été écrit pour 1,4 ou avant. Dans la mise en œuvre de Sun, le code Apache ne créerait aucun tableau temporaire Char [] code> (
string.substring code> et (initialement)
stringbuffer.tostring code> partage des tableaux de support). Donc, le code Apache aurait été, avant 2004, plus vite pour les grandes chaînes.
Vous ne savez pas quelle est la différence entre TUPPERCASE et TOITTLECASE, mais il semble que votre solution nécessite une instanciation de la catégorie à cordes, tandis que la mise en œuvre des communes Lang nécessite deux (sous-chaînes et la création de nouvelles chaînes que je suppose, puisque la chaîne est immuable). P>
Que ce soit "mieux" (je suppose que tu veux dire plus vite) Je ne sais pas. Pourquoi ne pas profiler les deux solutions? P>
StringBuilder (à partir de Java 5 à partir de) est plus rapide que Stringbuffer Si vous n'en avez pas besoin pour être en sécurité, mais d'autres ont dit que vous devez tester si cela est meilleur que votre solution dans votre cas. P>
performance est égale. p>
Votre code copie le char [] appelant Le code Apache sur string.tocharray () code> et
nouvelle chaîne (Chararray) code>. P>.
tampon.append (str.substring (1)) code> et
tampon.tostring () code>. Le code Apache a une instance de chaîne supplémentaire qui a la teneur en charge de la base [1, longueur]. Mais cela ne sera pas copié lorsque la chaîne d'instance est créée. P>
Si je devais écrire une bibliothèque, j'essaierais de m'assurer que j'ai eu mon droit d'unicode de beofre vous inquiétant de la performance. Sur le dessus de ma tête:
int len = str.length(); if (len == 0) { return str; } int head = Character.toUpperCase(str.codePointAt(0)); String tail = str.substring(str.offsetByCodePoints(0, 1)); return new String(new int[] { head }).concat(tail);
Utilisez cette méthode pour capitaliser de la chaîne. sa fonctionne totalement sans bug
/** * capitalize the first letter of a string * * @param String * @return String * */ public static String capitalizeFirst(String s) { if (s == null || s.length() == 0) { return ""; } char first = s.charAt(0); if (Character.isUpperCase(first)) { return s; } else { return Character.toUpperCase(first) + s.substring(1); } }
Si vous ne capitalisez que des mots limités, vous feriez mieux de le mettre en cache.
@Test public void testCase() { String all = "At its base, a shell is simply a macro processor that executes commands. The term macro processor means functionality where text and symbols are expanded to create larger expressions.\n" + "\n" + "A Unix shell is both a command interpreter and a programming language. As a command interpreter, the shell provides the user interface to the rich set of GNU utilities. The programming language features allow these utilities to be combined. Files containing commands can be created, and become commands themselves. These new commands have the same status as system commands in directories such as /bin, allowing users or groups to establish custom environments to automate their common tasks.\n" + "\n" + "Shells may be used interactively or non-interactively. In interactive mode, they accept input typed from the keyboard. When executing non-interactively, shells execute commands read from a file.\n" + "\n" + "A shell allows execution of GNU commands, both synchronously and asynchronously. The shell waits for synchronous commands to complete before accepting more input; asynchronous commands continue to execute in parallel with the shell while it reads and executes additional commands. The redirection constructs permit fine-grained control of the input and output of those commands. Moreover, the shell allows control over the contents of commandsâ environments.\n" + "\n" + "Shells also provide a small set of built-in commands (builtins) implementing functionality impossible or inconvenient to obtain via separate utilities. For example, cd, break, continue, and exec cannot be implemented outside of the shell because they directly manipulate the shell itself. The history, getopts, kill, or pwd builtins, among others, could be implemented in separate utilities, but they are more convenient to use as builtin commands. All of the shell builtins are described in subsequent sections.\n" + "\n" + "While executing commands is essential, most of the power (and complexity) of shells is due to their embedded programming languages. Like any high-level language, the shell provides variables, flow control constructs, quoting, and functions.\n" + "\n" + "Shells offer features geared specifically for interactive use rather than to augment the programming language. These interactive features include job control, command line editing, command history and aliases. Each of these features is described in this manual."; String[] split = all.split("[\\W]"); // 10000000 // upper Used 606 // hash Used 114 // 100000000 // upper Used 5765 // hash Used 1101 HashMap<String, String> cache = Maps.newHashMap(); long start = System.currentTimeMillis(); for (int i = 0; i < 100000000; i++) { String upper = split[i % split.length].toUpperCase(); // String s = split[i % split.length]; // String upper = cache.get(s); // if (upper == null) // { // cache.put(s, upper = s.toUpperCase()); // // } } System.out.println("Used " + (System.currentTimeMillis() - start)); }
Contre-question: La capitalisation des chaînes est-elle vraiment le goulot d'étranglement de votre application?
Je comprends que cela ne comporte pas beaucoup d'importance, mais si j'écrivais une bibliothèque, j'essaierais de le rendre aussi bon que possible.
Marrant. Si i i> écrirait une bibliothèque, j'essaierais de le faire travail i> aussi bon que possible.
codinghorror.com/blog/archives/001218.html profil, puis optimiser. Si vous écrivez une bibliothèque, rendez-vous facile à utiliser, difficile à abuser, puis à vous soucier de la vitesse. Tant que vous n'utilisez pas d'algorithmes stupides, il fonctionnera plutôt bien.
Dans les mots de Kent Beck - «Faites-le fonctionner, faites-la bien, faites-le rapidement». Les développeurs devinent généralement leurs goulots d'étranglement de toute façon.