[GO] [Java] Ein wenig mysteriöses Split-Verhalten

[Java] Ein wenig mysteriöses Split-Verhalten

Autorenumgebung

Java8 (sollte sein)

Split-Quiz

Plötzlich ist es ein Problem.

Unten ist der Java-Code. Was passiert mit dem Ausführungsergebnis?

Erste Frage! Deden ♪

            String test = "a-i-u-e-o";
            String[] tests = test.split("-");
            System.out.println(tests.length);
            System.out.println(java.util.Arrays.toString(tests));
Antwort
5
[a, i, u, e, o]

Hast du richtig geantwortet?

Nächster. Was sind die Ergebnisse hier?

            String test = "--o";
            String[] tests = test.split("-");
            System.out.println(tests.length);
            System.out.println(java.util.Arrays.toString(tests));
Antwort
3
[, , o]

Hast du richtig geantwortet? Wenn es am Anfang eine Begrenzung gibt, verhält es sich so.

Weiter ist hier. Was sind die Ergebnisse hier? Ich denke, man kann es irgendwie erwarten.

            String test = "a----o";
            String[] tests = test.split("-");
            System.out.println(tests.length);
            System.out.println(java.util.Arrays.toString(tests));
Antwort
5
[a, , , , o]

Hast du richtig geantwortet?

Na das letzte. Was sind die Ergebnisse hier? Wenn Sie bisher richtig geantwortet haben, ist sicher, dass </ font> einfach ist. Lass uns knusprig werden.

            String test = "a--";
            String[] tests = test.split("-");
            System.out.println(tests.length);
            System.out.println(java.util.Arrays.toString(tests));
Antwort
1
[a]

Hast du richtig geantwortet? Herzlichen Glückwunsch an diejenigen, die richtig geantwortet haben: tada: Es war bedauerlich, dass die Person abgehauen ist ... (´ ・ ω ・ `)

Übrigens war meine Reaktion, als ich diese Verhaltensweisen sah, so.

₍₍(ง˘ω˘)ว⁾⁾

?????????????????????????? Eh ...? Ah, ja ... Hmm (´_ ゝ `) Warum

Java-Split

Das Folgende ist eine Vogelperspektive auf das, was bisher veröffentlicht wurde.

/* 
 * Java Playground
 * https://code.sololearn.com
 */
class Main {
    public static void main(String[ ] args) {
        {
            String test = "a-i-u-e-o";
            String[] tests = test.split("-");
            System.out.println(tests.length); // 5
            System.out.println(java.util.Arrays.toString(tests)); // [a,i,u,e,o]
        }
        {
            String test = "a-";
            String[] tests = test.split("-");
            System.out.println(tests.length); // 1
            System.out.println(java.util.Arrays.toString(tests)); // [a]
        }
        {
            String test = "-o";
            String[] tests = test.split("-");
            System.out.println(tests.length); // 2
            System.out.println(java.util.Arrays.toString(tests)); // [,o]
        }
        {
            String test = "a--";
            String[] tests = test.split("-");
            System.out.println(tests.length); // 1
            System.out.println(java.util.Arrays.toString(tests)); // [a]
        }
        {
            String test = "--o";
            String[] tests = test.split("-");
            System.out.println(tests.length); // 3
            System.out.println(java.util.Arrays.toString(tests)); // [,,o]
        }
        {
            String test = "a----o";
            String[] tests = test.split("-");
            System.out.println(tests.length); // 5
            System.out.println(java.util.Arrays.toString(tests)); // [a,,,,o]
        }
    }
}

Was denken Sie. Ich Ehrlich gesagt denke ich, es fühlt sich schlecht an Gefun Gefun </ font> Ich wollte, dass klar ist, ob ich den Himmel ignorieren soll oder nicht. Es kann jedoch einen Grund für dieses Verhalten geben. [^ 1]

Serpentin

Golang trennte sich

Übrigens scheint das Split-Verhalten für jede Sprache unterschiedlich zu sein. Seien Sie also vorsichtig, wenn Sie mit mehreren Sprachen arbeiten. Als Beispiel sehen Sie hier ein relativ leicht verständliches Golang-Beispiel.

Golang Split Sample
/*
 * Golang Playground
 * https://play.golang.org/
 */
package main

import (
	"fmt"
	"strings"
)

func main() {
	{
		test := "a-i-u-e-o"
		tests := strings.Split(test, "-")
		fmt.Println(len(tests)) // 5
		fmt.Println(tests) // [a i u e o]
	}
	{
		test := "a-"
		tests := strings.Split(test, "-")
		fmt.Println(len(tests)) // 2
		fmt.Println(tests) // [a ]
	}
	{
		test := "-o"
		tests := strings.Split(test, "-")
		fmt.Println(len(tests)) // 2
		fmt.Println(tests) // [ o]
	}
	{
		test := "a--"
		tests := strings.Split(test, "-")
		fmt.Println(len(tests)) // 3
		fmt.Println(tests) // [a  ]
	}
	{
		test := "--o"
		tests := strings.Split(test, "-")
		fmt.Println(len(tests)) // 3
		fmt.Println(tests) // [  o]
	}
	{
		test := "a----o"
		tests := strings.Split(test, "-")
		fmt.Println(len(tests)) // 5
		fmt.Println(tests) // [a    o]
	}
}

Nachdem Sie das Verhalten von Java gesehen haben, fühlt es sich einfach an ...

Blinddarm

Java Split scheint also das am weitesten rechts stehende Trennzeichen einfach zu ignorieren Wenn Sie dasselbe Verhalten in Golang nachahmen möchten, möchten Sie möglicherweise das Trennzeichen ganz rechts entfernen und dann teilen. Ich weiß nicht, ob Bedarf besteht, aber ich werde ein Beispiel einfügen. Ich weiß nicht, ob Nachfrage besteht.

Golang verhält sich wie ein Java-Split (1 Mitglied)
package main

import (
	"fmt"
	"strings"
)

func main() {
	{
		test := "a-i-u-e-o"
		tests := javaSplit(test, "-")
		fmt.Println(len(tests)) // 5
		fmt.Println(tests) // [a i u e o]
	}
	{
		test := "a-"
		tests := javaSplit(test, "-")
		fmt.Println(len(tests)) // 1
		fmt.Println(tests) // [a]
	}
	{
		test := "-o"
		tests := javaSplit(test, "-")
		fmt.Println(len(tests)) // 2
		fmt.Println(tests) // [ o]
	}
	{
		test := "a--"
		tests := javaSplit(test, "-")
		fmt.Println(len(tests)) // 1
		fmt.Println(tests) // [a]
	}
	{
		test := "--o"
		tests := javaSplit(test, "-")
		fmt.Println(len(tests)) // 3
		fmt.Println(tests) // [  o]
	}
	{
		test := "a----o"
		tests := javaSplit(test, "-")
		fmt.Println(len(tests)) // 5
		fmt.Println(tests) // [a    o]
	}
}

//Java String#split(delimiter)Imitieren
func javaSplit(str string, delimiter string) []string {
    return strings.Split(strings.TrimRight(str, delimiter), delimiter)
}

Wenn Sie möchten, dass sich Java wie Golang verhält ...? ~~ Ah ... .. .Bitte geben Sie Ihr Bestes! ~~

[Zusatz]

Nun, wenn Sie möchten, dass sich Java wie Golang verhält ...?

@ saka1029 hat mich gelehrt!

Soll ich für das zweite Argument eine negative Zahl angeben? ([String.split (String, int)](https://docs.oracle.com/javase/jp/13/docs/api/java.base/java/lang/String.html#split (java.lang.) String, int))))

String[] test = "a--".split("-", -1);
System.out.println(test.length);               // -> 3
System.out.println(Arrays.toString(test));     // -> [a, , ]
Auszug aus javadoc

public String[] split​(String regex, int limit)

Der Parameter> limit steuert, wie oft dieses Muster angewendet wird, wodurch die Länge des resultierenden Arrays beeinflusst wird.

  • Wenn das "Limit" positiv ist, gilt das Muster für die meisten "Limits". - Sobald die Länge des Arrays den "Grenzwert" nicht überschreitet, sind alle Eingaben jenseits des zuletzt übereinstimmenden Trennzeichens im letzten Eintrag des Arrays enthalten.
  • Wenn das "Limit" Null ist, wird das Muster so oft wie möglich angewendet, das Array kann beliebig lang sein und alle nachfolgenden leeren Zeichenfolgen werden verworfen.
  • Wenn "Limit" negativ ist, wird das Muster nach Möglichkeit angewendet und die Länge des Arrays ist beliebig.

Genau das! Yay! ~~ Oder besser gesagt, lesen Sie Javadoc, bevor Sie ~~ schreiben Der Link ist java13 doc, aber java8 Ist dasselbe.

schließlich

Ich würde mich freuen, wenn Sie Kommentare abgeben könnten, wenn Sie Kommentare wie "Es ist schlecht hier" oder "Dieser Typ!" Haben. ₍₍ (ง ˘ω˘) ว ⁾⁾ Zero sagt mir nichts ...

[^ 1]: Es besteht kein Zweifel, dass es sich vorerst um eine Spezifikation handelt. https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#split-java.lang.String-

Recommended Posts