Was ist die eleganteste Art, ein Bindestrich-getrenntes Wort (z. B. "do-some-stuff") in die niedrigere Camel-Case-Variante (z. B. "doSomeStuff") in Java zu konvertieren?Was ist die eleganteste Art, ein Bindestrich-getrenntes Wort (z. B. "Mach etwas") in die niedrigere Camel-Case-Variante (z. B. "doSomeStuff") zu konvertieren?
Antwort
Verwenden CaseFormat
von Guava:
import static com.google.common.base.CaseFormat.*;
String result = LOWER_HYPHEN.to(LOWER_CAMEL, "do-some-stuff");
welcher ist LOWER_HYPHEN? "do-some-stuff" oder "do_some_stuff"? –
[Ein Hypen ist '-'] (http://en.wikipedia.org/wiki/Hyphen). Aus diesem Grund ist "LOWER_HYPEN" ein "Do-irgendwas" (http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/CaseFormat.html#LOWER_HYPHEN). ["do_some_stuff" wäre "LOWER_UNDERSCORE"] (http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/CaseFormat.html#LOWER_UNDERSCORE). –
Warum nicht versuchen:
- Split auf "-"
- Groß jedes Wort, das erste
- beitreten
EDIT Überspringen: Auf den zweiten Gedanken ... Beim Versuch, dies zu implementieren, habe ich herausgefunden, dass es keine einfache Möglichkeit gibt, einer Liste von Strings in Java beizutreten. Es sei denn, Sie verwenden StringUtil
von Apache. So benötigen Sie einen StringBuilder
sowieso zu schaffen und damit der Algorithmus wird ein wenig hässlich :(
CODE bekommen. Hier ist ein Beispiel der oben erwähnten aproach Könnte jemand mit einem Java-Compiler (sorry, don ‚t ein handliches Test) dieses haben? und Benchmark mit anderen Versionen hier?
public static String toJavaMethodNameWithSplits(String xmlMethodName)
{
String[] words = xmlMethodName.split("-"); // split on "-"
StringBuilder nameBuilder = new StringBuilder(xmlMethodName.length());
nameBuilder.append(words[0]);
for (int i = 1; i < words.length; i++) // skip first
{
nameBuilder.append(words[i].substring(0, 1).toUpperCase());
nameBuilder.append(words[i].substring(1));
}
return nameBuilder.toString(); // join
}
Dies erzeugt eine Menge String-Objekte (~ 8 zusätzliche Strings + ein Array für das angegebene Beispiel). Dies könnte ein Problem sein, wenn Sie viele XML-Tags verarbeiten müssen. –
Die JVM ist sehr gut für den Umgang mit vielen kurzlebigen Objekten, einschließlich Strings, ausgestattet. –
Hmm .. ich denke, es gibt einige Lösungen, die besser funktionieren. – codevour
Iterate durch den Strang. Wenn Sie einen Bindestrich finden, entfernen Sie diese, und profitieren Sie den nächsten Buchstaben.
die Die folgende Methode sollte die Aufgabe in O (n) recht effizient behandeln, wir iterieren nur über t Die Zeichen des Namens der xml-Methode, überspringen Sie ein '-' und aktivieren Sie die Zeichen falls erforderlich.
public static String toJavaMethodName(String xmlmethodName) {
StringBuilder nameBuilder = new StringBuilder(xmlmethodName.length());
boolean capitalizeNextChar = false;
for (char c:xmlMethodName.toCharArray()) {
if (c == '-') {
capitalizeNextChar = true;
continue;
}
if (capitalizeNextChar) {
nameBuilder.append(Character.toUpperCase(c));
} else {
nameBuilder.append(c);
}
capitalizeNextChar = false;
}
return nameBuilder.toString();
}
Warum das Char-Array, wenn Sie einfach charAt() verwenden können? –
@ Thorbjörn - Ich bevorzuge nur die erweiterte for loop Ausdruck. Persönlicher Stil. Aber du hast Recht - nicht mit 'toCharArray()' sollte etwas schneller sein –
Hier ist eine leichte Variation von Andreas' answer, der mehr noch als die OP fragte nach:
public static String toJavaMethodName(final String nonJavaMethodName){
final StringBuilder nameBuilder = new StringBuilder();
boolean capitalizeNextChar = false;
boolean first = true;
for(int i = 0; i < nonJavaMethodName.length(); i++){
final char c = nonJavaMethodName.charAt(i);
if(!Character.isLetterOrDigit(c)){
if(!first){
capitalizeNextChar = true;
}
} else{
nameBuilder.append(capitalizeNextChar
? Character.toUpperCase(c)
: Character.toLowerCase(c));
capitalizeNextChar = false;
first = false;
}
}
return nameBuilder.toString();
}
Es kann einige Sonderfälle behandelt:
fUnnY-cASe
-funnyCase
--dash-before-and--after-
umgewandelt wirddashBeforeAndAfter
some.other$funky:chars?
umgewandelt wirdsomeOtherFunkyChars
Das ist eine sehr coole Lösung, danke. – codevour
umgewandelt Wenn Sie Sie eine Kombination aus einem regulären Ausdruck verwenden können, nicht auf einer Bibliothek gerne abhängen und String.format
. Verwenden Sie eine Regex, um die Startzeichen nach der -
zu extrahieren. Verwenden Sie diese als Eingabe für String.format
. Ein bisschen schwierig, aber funktioniert ohne eine (explizit) Schleife;).
public class Test {
public static void main(String[] args) {
System.out.println(convert("do-some-stuff"));
}
private static String convert(String input) {
return String.format(input.replaceAll("\\-(.)", "%S"), input.replaceAll("[^-]*-(.)[^-]*", "$1-").split("-"));
}
}
Können Sie erweitern, wie die zweite alle Ausdruck ersetzen "[^ -] * - (.) [^ -] *" funktioniert? – startoftext
erhalten Die Apache Commons Glas für StringUtils.Dann können Sie die Methode
import org.apache.commons.lang.StringUtils;
public class MyClass{
public String myMethod(String str) {
StringBuffer buff = new StringBuffer();
String[] tokens = str.split("-");
for (String i : tokens) {
buff.append(StringUtils.capitalize(i));
}
return buff.toString();
}
}
Ich hatte keine Wahl, andere Bibliotheken zu importieren, aber Apache Commons ist ein gemeinsamer Faktor für alle Projekte. Ich wünsche, dass diese Antwort auch die meisten Stimmen erhält :) – tusar
Kapital verwenden, wie ich bin kein großer Fan von Bibliothek Hinzufügen nur für ein Verfahren, implementiert ich meine eigene Lösung (von Kamel Fall Schlange Fall):
public String toSnakeCase(String name) {
StringBuilder buffer = new StringBuilder();
for(int i = 0; i < name.length(); i++) {
if(Character.isUpperCase(name.charAt(i))) {
if(i > 0) {
buffer.append('_');
}
buffer.append(Character.toLowerCase(name.charAt(i)));
} else {
buffer.append(name.charAt(i));
}
}
return buffer.toString();
}
Muss abhängig von den Ein-/Ausgangsfällen angepasst werden.
Noch nützlich für mich, auch wenn es das Gegenteil der gestellten Frage ist. :) – pdem
Mit Java gibt es endlich einen Einzeiler:
Arrays.stream(name.split("\\-"))
.map(String::toLowerCase)
.map(s -> s.substring(0, 1).toUpperCase() + s.substring(1))
.collect(Collectors.joining());
Obwohl es Aufspaltung über 4 tatsächlichen Linien nimmt lesbar sein ツ
(Anmerkung: "\\-"
für ist Kebab-Fall nach Frage, für snake_case einfach auf "_"
wechseln)
Für diejenigen, die com.fasterxml.jackson hat wollen Bibliothek im Projekt und nicht Guave fügen Sie die jaskson namingStrategy Methode verwenden können:
new PropertyNamingStrategy.SnakeCaseStrategy.translate(String);
- 1. Was ist Doppelstern (z. B. NSError **)?
- 2. Konvertieren Excel-Spalte Alphabet (z. B. AA) zu Nummer (z. B. 25)
- 3. Fehlerbehebung z. B. Flash 404
- 4. MySQL mehrere Elemente übereinstimmen, wo (A, B, Z) IN (A, B, C, E, Z)
- 5. Was passiert in C, wenn ein größerer Datentyp (z. B. int) in einen kleineren Datentyp (z. B. kurz) konvertiert wird?
- 6. Unterschied zwischen ComponentModel-Reflektion (z. B. PropertyDescriptor) und Standardreflexion (z. B. PropertyInfo)?
- 7. R Zeichenkettendatum konvertieren (z. B. "1. Oktober 2014") in Datumsformat
- 8. Was ist die eleganteste Art, Bereiche in Ruby zu sortieren
- 9. Wie funktionieren verteilte Transaktionen (z. B. MSDTC)?
- 10. Wie verwende ich die Buchfunktionen (z. B. Konkordanz) in NLTK?
- 11. Plattformübergreifendes Befehlszeilenskript (z. B. .bat und .sh)
- 12. Was muss ich in der MySQL-Abfrage beachten, z. B.%?
- 13. Indexkonvertierung: zeilenweise kartesische Koordinaten (z. B. Pixel)
- 14. Messen Sie die Präzision des Timers (z. B. Stoppuhr/QueryPerformanceCounter)
- 15. Javascript Autokomplettierung für DSL. (z. B. SQL)
- 16. iOS8 regionale Lokalisierung (z. B. pt-BR)?
- 17. Kann WebSphere MQ die Datei (z. B. * .txt) direkt übertragen?
- 18. Übereinstimmende Sonderzeichen (z. B. #, +) mit pg_search
- 19. Schienen - Params mit "Punkt" (z. B. /google.com)
- 20. textView, z. B. kann nicht ausgewählt werden?
- 21. Lesen eines Preises (z. B. $ 89.95) in ein Doppel
- 22. Passende Zeichenfolge mit Shell-Wildcards (z. B. *)
- 23. Bild (z. B. jpg) einer Webseite generieren?
- 24. Serialize-Berechtigungen (z. B. CanCan) mit Active_model_serializers
- 25. Möchten Staging-Subdomain erstellen z. B. staging.example.com
- 26. Ist vektorisierte Datenmanipulation sequentiell (z. B. R und MATLAB)?
- 27. Ein Mercurial-Repository automatisch importieren (z. B. SVN Externals)
- 28. Möglich, Klassenpfad von Type-Objekt zu erhalten? (z. B. com.test.xyz.CLASSNAME)
- 29. Interkonvertierbarkeit von asymmetrischen Schlüsselcontainern (z. B. X.509, PGP, OpenSSH)
- 30. Wie kann ich verlangen, dass Browser bestimmte Seitenelemente, wie z. B. CSS-Blätter, immer aktualisieren (z. B. niemals zwischenspeichern)?
WTH ist jedes Beispiel Antwort eine öffentliche statische Methode implementiert? Wenn dies eindeutig ein verstecktes Implementierungsdetail einer größeren Abstraktion sein soll. –