Tl;dr
Die moderne Lösung verwendet Unicode-Codepunkt Zahlen und nicht die veralteten char
type.
Hier ist ein IntStream
eine aufeinanderfolgende Folge von Codepunktnummern für jedes Zeichen und gibt jede dieser Nummern auf der Konsole aus:
"S1234567I"
.codePoints()
.forEach( System.out :: println )
83
49
50
51
52
53
54
55
73
Zeigen Sie jedes Zeichen zusammen mit seiner Codepunktnummer an. Um eine Codepunktnummer wieder in ein Zeichen umzuwandeln, rufen Sie Character.toString
bei der Übergabe der Ganzzahl: Character.toString( codePoint )
.
String s = Character.toString( 49 ) ; // Returns "1".
und
String s = Character.toString( 128_567 ) ; // Returns "" FACE WITH MEDICAL MASK.
例
"S1234567I".codePoints().forEach( ( int codePoint ) -> {
String message = Character.toString( codePoint ) + " " + codePoint;
System.out.println( message );
} );
S 83
1 49
2 50
3 51
4 52
5 53
6 54
7 55
I 73
Unicode-Codepunkt
Le site char
ist veraltet und kann nicht einmal die Hälfte der 143.859 Zeichen darstellen, die in Unicode . その char
Typ ist ein 16-Bit darunter liegende Zahl, die einen Zahlenbereich von etwa ± 64.000 darstellen kann. Unicode-Zeichen werden Zahlen in einem Bereich von etwa einer Million zugeordnet, zu groß für char
zu handhaben.
Verwenden Sie stattdessen Unicode Codepunkt Ganzzahlige Zahlen zur Darstellung einzelner Zeichen.
Wir können einen Strom von int
primitive Werte ( IntStream
) aus einer Zeichenkette, wobei jede Zahl den Unicode-Codepunkt jedes aufeinanderfolgenden Zeichens darstellt.
IntStream intStream = "S1234567I".codePoints() ;
Verarbeiten Sie jede Codepunktnummer. Hier drucken wir einfach jede Nummer.
intStream.forEach( System.out :: println );
Wenn ausgeführt.
83
49
50
51
52
53
54
55
73
Oder vielleicht wollen Sie ein Array der int
Zahlen.
int[] codePoints = "S1234567I".codePoints().toArray();
Dump auf die Konsole.
System.out.println( "codePoints = " + Arrays.toString( codePoints ) );
codePoints = [83, 49, 50, 51, 52, 53, 54, 55, 73]
Oder vielleicht möchten Sie eine List
Objekt, das alle diese Codepunktnummern enthält. Hier ist eine nicht änderbare Liste, die von List.of
. Wir nennen boxed
aufzurufen auto-boxing Funktion zum Konvertieren int
Primitive in Integer
Objekte. Dann wird ein Collector
Implementierung sammelt die Ausgabe des Streams in einem List
.
List < Integer > codePoints = "S1234567I".codePoints().boxed().collect( Collectors.toList() );
Diese Teile zu erklären:
List < Integer > codePoints = // Desired result is a `List` collection of `Integer` objects.
"S1234567I" // Your input string.
.codePoints() // Generate an `IntStream`, a succession of `int` integer numbers representing the Unicode code point number of each character in the `String` object.
.boxed() // Convert each `int` primitive to an `Integer` object.
.collect( // Collect the produced `Integer` objects together.
Collectors.toList() // Specify a `Collector` implementation that knows how to make a `List` object, containing our `Integer` objects.
) // Returns a `List` of `Integer` objects.
;
Ziffern ziehen
Vielleicht möchten Sie Filter die alphabetischen Zeichen heraus, so dass nur die Ziffern übrig bleiben, die in der Eingabezeichenfolge enthalten sind. Die Character
Klasse bietet Tests wie isDigit
.
Bei einer Eingabe von "S1234567I"
bedeutet dies, dass die S
und die I
verlassen. 1234567
und ergibt die ganzzahlige Zahl 1.234.567.
List < Integer > codePointsOfDigitsFromInput = "S1234567I".codePoints().filter( ( int codePoint ) -> Character.isDigit( codePoint ) ).boxed().collect( Collectors.toList() );
Verteilen Sie das auf mehrere Zeilen.
List < Integer > codePointsOfDigitsFromInput =
"S1234567I"
.codePoints()
.filter(
( int codePoint ) -> Character.isDigit( codePoint )
)
.boxed()
.collect( Collectors.toList() );
codePointsOfDigitsFromInput = [49, 50, 51, 52, 53, 54, 55]
Wir können diesen Code ändern, um eine String
die nur Ziffern aus dieser Eingabe enthält. Siehe Frage, Eine Zeichenkette aus einem IntStream von Codepunktnummern erstellen? . Und dann machen wir eine int
Ganzzahlige Nummer des Textes.
String numberComponentFromInput =
"S1234567I"
.codePoints()
.filter(
( int codePoint ) -> Character.isDigit( codePoint )
)
.collect( // Collect the results of processing each code point.
StringBuilder :: new , // Supplier<R> supplier
StringBuilder :: appendCodePoint , // ObjIntConsumer<R> accumulator
StringBuilder :: append // BiConsumer<R,R> combiner
)
.toString();
int x = Integer.valueOf( numberComponentFromInput );
ZahlKomponenteAusEingabe = 1234567
x = 1234567