Java >> Java tutorial >  >> Tag >> char

Del en streng hver n tegn i Java

1. Oversigt

I denne vejledning skal vi kaste lys over, hvordan man opdeler en streng hver n tegn i Java .

Først vil vi starte med at udforske mulige måder at gøre dette på ved hjælp af indbyggede Java-metoder. Derefter vil vi vise, hvordan man opnår det samme mål ved hjælp af Guava.

2. Brug af String#split Metode

strengen klasse kommer med en praktisk metode kaldet split. Som navnet antyder, den opdeler en streng i flere dele baseret på et givet afgrænsningstegn eller regulært udtryk.

Lad os se det i aktion:

public static List<String> usingSplitMethod(String text, int n) {
    String[] results = text.split("(?<=\\G.{" + n + "})");

    return Arrays.asList(results);
}

Som vi kan se, brugte vi regex (?<=\\G.{” + n + “}) hvor n er antallet af tegn. Det er en positiv look-behind-påstand der matcher en streng, der har det sidste match (\G) efterfulgt af n tegn .

Lad os nu oprette en testcase for at kontrollere, at alt fungerer som forventet:

public class SplitStringEveryNthCharUnitTest {

    public static final String TEXT = "abcdefgh123456";

    @Test
    public void givenString_whenUsingSplit_thenSplit() {
        List<String> results = SplitStringEveryNthChar.usingSplitMethod(TEXT, 3);

        assertThat(results, contains("abc", "def", "gh1", "234", "56"));
    }
}

3. Brug af String#substring Metode

En anden måde at opdele en streng objekt ved hvert n'te tegn er at bruge understrengen metode.

Grundlæggende kan vi sløjfe gennem strengen og kalde understreng at opdele det i flere portioner baseret på det angivne n tegn:

public static List<String> usingSubstringMethod(String text, int n) {
    List<String> results = new ArrayList<>();
    int length = text.length();

    for (int i = 0; i < length; i += n) {
        results.add(text.substring(i, Math.min(length, i + n)));
    }

    return results;
}

Som vist ovenfor er understrengen metode tillader os at få den del af strengen mellem det aktuelle indeks i og i+n.

Lad os nu bekræfte dette ved hjælp af en testcase:

@Test
public void givenString_whenUsingSubstring_thenSplit() {
    List<String> results = SplitStringEveryNthChar.usingSubstringMethod(TEXT, 4);

    assertThat(results, contains("abcd", "efgh", "1234", "56"));
}

4. Brug af mønsteret Klasse

Mønster tilbyder en kortfattet måde at kompilere et regulært udtryk og matche det mod en given streng.

Så med det korrekte regex kan vi bruge mønster for at nå vores mål:

public static List<String> usingPattern(String text, int n) {
    return Pattern.compile(".{1," + n + "}")
        .matcher(text)
        .results()
        .map(MatchResult::group)
        .collect(Collectors.toList());
}

Som vi kan se, brugte vi “.{1,n}” som regex for at skabe vores mønster objekt. Det matcher mindst én og højst n tegn.

Lad os endelig skrive en simpel test:

@Test
public void givenString_whenUsingPattern_thenSplit() {
    List<String> results = SplitStringEveryNthChar.usingPattern(TEXT, 5);

    assertThat(results, contains("abcde", "fgh12", "3456"));
}

5. Brug af Guava

Nu hvor vi ved, hvordan man deler en streng hver n tegn ved hjælp af kerne Java-metoder, lad os se, hvordan man gør det samme ved hjælp af Guava-biblioteket:

public static List<String> usingGuava(String text, int n) {
    Iterable<String> parts = Splitter.fixedLength(n).split(text);

    return ImmutableList.copyOf(parts);
}

Guava leverer Splitteren klasse for at forenkle logikken i at udtrække understrenge fra en streng. fixedLength() metode opdeler den givne streng i stykker af den angivne længde .

Lad os verificere vores metode med en testcase:

@Test
public void givenString_whenUsingGuava_thenSplit() {
    List<String> results = SplitStringEveryNthChar.usingGuava(TEXT, 6);

    assertThat(results, contains("abcdef", "gh1234", "56"));
}

6. Konklusion

For at opsummere det forklarede vi, hvordan man opdeler en streng ved hvert n'te tegn ved hjælp af Java-metoder.

Derefter viste vi, hvordan man opnår det samme mål ved hjælp af Guava-biblioteket.

Som altid kan koden, der bruges i denne artikel, findes på GitHub.


Java tag