복붙노트

[SCALA] 왜 빈 문자열에 "분할"비어 있지 않은 배열을 반환합니까?

SCALA

왜 빈 문자열에 "분할"비어 있지 않은 배열을 반환합니까?

빈 문자열에 분할 크기 1의 배열을 반환합니다 :

scala> "".split(',')
res1: Array[String] = Array("")

이 빈 배열을 반환하도록 고려 :

scala> ",,,,".split(',')
res2: Array[String] = Array()

설명 해주십시오 :)

해결법

  1. ==============================

    1.같은 이유로이 들어

    같은 이유로이 들어

    ",test" split ','
    

    ",test," split ','
    

    첫 경기는 첫 번째 요소로 반환되기 전에 크기 2. 모두의 배열을 반환합니다.

  2. ==============================

    2.당신이 오렌지를 제로 시간을 분할하는 경우, 당신은 정확히 하나 개의 조각이 - 오렌지를.

    당신이 오렌지를 제로 시간을 분할하는 경우, 당신은 정확히 하나 개의 조각이 - 오렌지를.

  3. ==============================

    3.빈 문자열을 분할하면 첫 번째 요소로 빈 문자열을 반환합니다. 에 분리가 대상 문자열에서 찾을 수없는 경우, 당신은 비어있는 경우에도 크기가 원래 문자열을 들고 1의 배열을 얻을 것이다.

    빈 문자열을 분할하면 첫 번째 요소로 빈 문자열을 반환합니다. 에 분리가 대상 문자열에서 찾을 수없는 경우, 당신은 비어있는 경우에도 크기가 원래 문자열을 들고 1의 배열을 얻을 것이다.

  4. ==============================

    4.자바와 스칼라 분할 방법은 다음과 같이 두 단계로 운항합니다 :

    자바와 스칼라 분할 방법은 다음과 같이 두 단계로 운항합니다 :

    이것에 따르면, 결과가 "".split에는 ( ""), 오른쪽 때문에 두 번째 단계의 빈 배열되어야 하는가?

    그것은해야한다. 불행하게도, 이것은 인위적으로 도입 코너 케이스입니다. 그리고 그 나쁜이지만,이 문서를 살펴보고 기억한다면 적어도 그것은 있으며, java.util.regex.Pattern에 설명되어 있습니다 :

    그래서, 난 항상 == N 통과 조언 -1 두 번째 매개 변수로 특별히 당신이 달성하고자하는 것을 알고하지 않는 한, (이 위의 두 단계를 건너 뜁니다) / 당신은 빈 문자열 일이 그 프로그램이 것이 아니라고 확신 입력으로 얻을.

    이미 프로젝트에 구아바를 사용하는 경우, 당신은 분배기 (문서) 클래스를 시도 할 수 있습니다. 그것은 매우 풍부한 API를 가지고 있으며, 매우 이해하기 쉽게 코드를 만든다.

    Splitter.on(".").split(".a.b.c.") // "", "a", "b", "c", ""
    Splitter.on(",").omitEmptyStrings().split("a,,b,,c") // "a", "b", "c"
    Splitter.on(CharMatcher.anyOf(",.")).split("a,b.c") // "a", "b", "c"
    Splitter.onPattern("=>?").split("a=b=>c") // "a", "b", "c"
    Splitter.on(",").limit(2).split("a,b,c") // "a", "b,c"
    
  5. ==============================

    5."A".split ( ",") -> "A" 따라서 "".split ( ",") -> ""

    "A".split ( ",") -> "A" 따라서 "".split ( ",") -> ""

  6. ==============================

    6.모든 프로그래밍 언어에서 나는 빈 문자열이 여전히 유효한 문자열 알고있다. 항상 요소가 빈 문자열 인 단일 요소 배열을 반환합니다 어떤 구분 기호를 사용하여 분할 하 고 그래서. 이 널이 있었다면 (비어 있지 않은) 문자열은 그 다른 문제가 될 것입니다.

    모든 프로그래밍 언어에서 나는 빈 문자열이 여전히 유효한 문자열 알고있다. 항상 요소가 빈 문자열 인 단일 요소 배열을 반환합니다 어떤 구분 기호를 사용하여 분할 하 고 그래서. 이 널이 있었다면 (비어 있지 않은) 문자열은 그 다른 문제가 될 것입니다.

  7. ==============================

    7.이 분할 동작은 좋든 나쁘 든 들어, 자바에서 상속됩니다 ... 스칼라는 문자열 원시의 정의를 무시하지 않습니다.

    이 분할 동작은 좋든 나쁘 든 들어, 자바에서 상속됩니다 ... 스칼라는 문자열 원시의 정의를 무시하지 않습니다.

    이 동작을 수정하기 위해 인수 제한을 사용할 수 있습니다, 참고 :

    즉, 당신은 = 한계를 설정할 수 있습니다 -1 (모든?) 다른 언어의 동작을 얻을 :

    @ ",a,,b,,".split(",")
    res1: Array[String] = Array("", "a", "", "b")
    
    @ ",a,,b,,".split(",", -1)  // limit=-1
    res2: Array[String] = Array("", "a", "", "b", "", "")
    

    자바의 동작은 매우 혼란 있지만 잘 알려진 것으로 보인다 것 :

    참고 : 분할 방법은 처음부터 자바 없었다 (는 1.0.2에없는)하지만 실제로는 적어도 1.4에서 (예를 들어, 2002 년경 JSR51 참조)가있다. 난 아직 조사하고 ...

    무엇 불분명 것은 자바가 처음에 이것을 선택한 이유 (내 의혹은 원래 '가장자리 사건 "의 감독 / 버그라고이다),하지만 지금은 돌이킬 언어로 구운하고 유지되도록한다.

  8. ==============================

    8.빈 문자열은 특별한 상태 분할하면서 문자열이 없습니다. 당신은 사용할 수 있습니다 :

    빈 문자열은 특별한 상태 분할하면서 문자열이 없습니다. 당신은 사용할 수 있습니다 :

    Some(str)
      .filter(_ != "")
      .map(_.split(","))
      .getOrElse(Array())
    
  9. from https://stackoverflow.com/questions/4964484/why-does-split-on-an-empty-string-return-a-non-empty-array by cc-by-sa and MIT license