Dus ik wil herhalen voor elk teken in een tekenreeks.
Dus ik dacht:
for (char c : "xyz")
maar ik krijg een compilerfout:
MyClass.java:20: foreach not applicable to expression type
Hoe kan ik dit doen?
Antwoord 1, autoriteit 100%
De gemakkelijkste manier om voor elke char
in een Stream
te zorgen, is door toCharArray()
te gebruiken:
for (char ch: "xyz".toCharArray()) {
}
Dit geeft je de beknoptheid van elke constructie, maar helaas moet Stream
(die onveranderlijk is) een defensieve kopie uitvoeren om de char[]
te genereren (wat veranderlijk), dus er is een kostenboete.
Uit de documentatie:
[
toCharArray()
retourneert] een nieuw toegewezen tekenreekswaarvan de lengte gelijk is aan de lengte van deze tekenreeks en waarvan de inhoud is geïnitialiseerd om de tekenreeks te bevatten die door deze tekenreeks wordt vertegenwoordigd .
Er zijn meer uitgebreide manieren om tekens in een array te herhalen (regular for loop, CharacterIterator
, enz.), maar als u bereid bent de kosten te betalen toCharArray()
voor-elk is het meest beknopt.
Antwoord 2, autoriteit 15%
String s = "xyz";
for(int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
}
Antwoord 3, autoriteit 3%
Een andere handige oplossing, je kunt met deze string werken als array van String
for (String s : "xyz".split("")) {
System.out.println(s);
}
Antwoord 4, autoriteit 2%
Je moet het String-object converteren naar een array van char met behulp van de toCharArray
() methode van de klasse String:
String str = "xyz";
char arr[] = str.toCharArray(); // convert the String object to array of char
// iterate over the array using the for-each loop.
for(char c: arr){
System.out.println(c);
}
Antwoord 5, autoriteit 2%
Als je Java 8 gebruikt, kun je chars()
op een Stream
gebruiken om een Stream
van tekens te krijgen, maar je hebt om de int
terug te casten naar een char
als chars()
retourneert een IntStream
.
"xyz".chars().forEach(i -> System.out.print((char)i));
Als u Java 8 gebruikt met Eclipse Collections, kunt u de CharAdapter
class forEach
methode met een lambda- of methodeverwijzing om alle tekens in een Stream
te herhalen.
Strings.asChars("xyz").forEach(c -> System.out.print(c));
Dit specifieke voorbeeld kan ook een methodeverwijzing gebruiken.
Strings.asChars("xyz").forEach(System.out::print)
Opmerking: ik ben een toegewijde voor Eclipse Collections.
Antwoord 6
In Java 8kunnen we het oplossen als:
String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));
De methode chars() retourneert een IntStream
zoals vermeld in doc:
Retourneert een stroom van int nul die de char-waarden hiervan uitbreidt
volgorde. Elke char die is toegewezen aan een surrogaatcodepunt wordt doorgegeven
door ongeinterpreteerd. Als de sequentie is gemuteerd terwijl de stream is
wordt gelezen, is het resultaat niet gedefinieerd.
Waarom forEachOrdered
gebruiken en niet forEach
?
Het gedrag van forEach
is expliciet niet-deterministisch waarbij de forEachOrdered
een actie uitvoert voor elk element van deze stream, in de ontmoetingsvolgorde van de streamals de stream een gedefinieerde ontmoetingsvolgorde heeft. Dus forEach
garandeert niet dat de bestelling behouden blijft. Bekijk ook deze vraagvoor meer informatie.
We kunnen ook codePoints()
gebruiken om af te drukken, zie dit antwoordvoor meer details .
Antwoord 7
Helaas zorgt Java er niet voor dat Stream
Iterable<Character>
implementeert. Dit zou gemakkelijk kunnen. Er is StringCharacterIterator
maar dat implementeert niet eens Iterator
… Dus maak je eigen:
public class CharSequenceCharacterIterable implements Iterable<Character> {
private CharSequence cs;
public CharSequenceCharacterIterable(CharSequence cs) {
this.cs = cs;
}
@Override
public Iterator<Character> iterator() {
return new Iterator<Character>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < cs.length();
}
@Override
public Character next() {
return cs.charAt(index++);
}
};
}
}
Nu kun je (enigszins) gemakkelijk for (char c : new CharSequenceCharacterIterable("xyz"))
…
uitvoeren
Antwoord 8
Je kunt in dit geval ook een lambda gebruiken.
String s = "xyz";
IntStream.range(0, s.length()).forEach(i -> {
char c = s.charAt(i);
});
Antwoord 9
Voor Travers an String kun je ook charAt()
gebruiken met de string.
vind ik leuk:
String str = "xyz"; // given String
char st = str.charAt(0); // for example we take 0 index element
System.out.println(st); // print the char at 0 index
charAt()
is een methode voor het afhandelen van strings in Java die helpt om de string voor een specifiek teken te doorkruisen.