Hoe pas ik de for-each-lus toe op elk teken in een string?

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 charin een Streamte 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 Streamgebruiken om een Streamvan tekens te krijgen, maar je hebt om de intterug te casten naar een charals chars()retourneert een IntStream.

"xyz".chars().forEach(i -> System.out.print((char)i));

Als u Java 8 gebruikt met Eclipse Collections, kunt u de CharAdapterclass forEachmethode met een lambda- of methodeverwijzing om alle tekens in een Streamte 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 IntStreamzoals 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 forEachOrderedgebruiken en niet forEach?

Het gedrag van forEachis expliciet niet-deterministisch waarbij de forEachOrderedeen actie uitvoert voor elk element van deze stream, in de ontmoetingsvolgorde van de streamals de stream een gedefinieerde ontmoetingsvolgorde heeft. Dus forEachgarandeert 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 StreamIterable<Character>implementeert. Dit zou gemakkelijk kunnen. Er is StringCharacterIteratormaar 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.

Other episodes