Ist dies der richtige Weg, um ein Zeichen in Java in einen String zu konvertieren? [Duplikat]

20

Beim Schreiben von Komponententests für eine Funktion boolean, die zwei StringSekunden zurückgibt, musste ich jedes Zeichen des Alphabets ( 'a'- 'z') nacheinander als einen der Parameter einzeln testen. Dazu habe ich Folgendes geschrieben:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, new String(c));
} 

Ich hätte gedacht, dass dies zulässig ist, aber es war nicht so, also habe ich es stattdessen einfach so gemacht:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, ((Character) c).toString());
} 

Ist dies eine zuverlässige Methode, um chara Stringin Java in a zu konvertieren ? Ist es der bevorzugte Weg? Ich weiß nicht viel über Java und möchte daher einige Erläuterungen dazu.

Govind Parmar
quelle
2
Nicht direkt auf Ihre Frage, aber ich würdeIntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
Elliott Frisch
3
@ElliottFrisch aber warum? Streams sind hier nicht erforderlich, aber selbst wenn Sie darauf bestehen, Streams für jede Schleife zu verwenden, warum nicht zumindest verwenden IntStream.rangeClosed('a', 'z')?
PhilipRoman
1
Es gibt keinen einzigen "richtigen" Weg. Es gibt wahrscheinlich mindestens fünf Möglichkeiten, dies zu tun: Welche Sie wählen, hängt sowohl von der Mode als auch von den wissenschaftlichen Fakten ab. Meistens spielt es einfach keine Rolle, und ein Testprogramm ist sicherlich einer dieser Fälle.
user207421
@PhilipRoman Weil es da ist (Edmund Hillary). Weil ich kann. Weil wir wollen (Billie Piper, denke ich). Das ist auch ein cooler Ansatz.
Elliott Frisch
Ich hätte gedacht, dass dies zulässig ist. Sie dachten, es wäre zulässig, einen StringKonstruktor aufzurufen , der nicht existiert? Korrigieren Sie mich, wenn ich falsch liege, aber soweit mir bekannt ist, gibt es in der Klasse keinen Konstruktor String, der ein einziges charArgument akzeptiert. Beachten Sie, dass dies charnicht dasselbe ist wie char[].
Abra vor

Antworten:

33

Die kürzeste Lösung:

char c = 'a';
String s = "" + c;

Die saubersten (und wahrscheinlich effizientesten 1 ) Lösungen:

char c = 'a';

String s1 = String.valueOf(c);
// or
String s2 = Character.toString(c);

Im Vergleich zu Ihrem Ansatz verhindert das oben Gesagte, dass das Grundelement in ein CharacterObjekt gepackt werden muss.


1 Die leichte Ineffizienz der Zeichenfolgenverkettung im ersten Ansatz kann durch den Compiler oder die Laufzeit optimiert werden, sodass einer (wenn er so geneigt wäre) tatsächlich einen Mikro-Benchmark ausführen müsste, um die tatsächliche Leistung zu bestimmen. Mikrooptimierungen wie diese sind selten die Mühe wert, und das Verlassen auf Verkettung, um die Konvertierung von Zeichenfolgen zu erzwingen, sieht einfach nicht besonders gut aus.

Robby Cornelissen
quelle
6
Beim letzten Mal javacverwandelt sich der Compiler von Sun automatisch String s = "" + c;in String s = String.valueOf(c);, sodass die Leistung gleich ist.
Neil
4
@ Neil Puh! Ich begann zu denken, dass die Art von Person, für die ich diese Fußnote geschrieben habe, bei Stack Overflow nicht mehr existiert :)
Robby Cornelissen