2016-07-21 2 views
2

단어를 개별 문자로 분할하려고합니다.Android String.split ("")이 여분의 요소를 반환했습니다.

String.split ("")과 String.split ("|")을 모두 시도했지만 단어를 분리하면 여분의 빈 요소가 생성됩니다. 예 :

word = "word"; 
    int n = word.length(); 
    Log.i("20",Integer.toString(n)); 
    String[] letters = word.split("|"); 
    Log.i("25",Integer.toString(letters.length)); 

안드로이드 모니터의 출력은 다음과 같습니다

07-21 15:50:23.084 5711-5711/com.strizhevskiy.movetester I/20: 4 
07-21 15:50:23.085 5711-5711/com.strizhevskiy.movetester I/25: 5 

나는 텍스트 뷰 블록으로 개별 문자를 넣어 사실 여분의 빈 텍스트 뷰를 볼 수 있습니다. 4.

나는 거의이 방법의 안드로이드의 구현의 실제 버그라고 생각 안넘어 : 내 일반 자바에서 이러한 방법을 테스트 할 때

그것은 예상되는 답을 출력합니다.

+3

8. 당신이 realllllly String's'단일 문자의 배열이 아닌 char's'의 배열을 할 몇 가지 이유가 자바를 변경 당신이 것 'word.toCharArray()'를 사용하여 얻으시겠습니까? – childofsoong

+1

아니요. 작동하는지 확인해 볼 수 있습니다. 그러나 일반적인 방법이 다르게 작동하는 것처럼 보이는 문제는 해결되지 않습니다. 이미 다른 해결 방법을 찾았지만 왜 작동하지 않는지 알고 싶습니다. –

+3

이것은 Java 버전 7까지의'String # split'에 대한 예상 된 동작이며 Java 8에서 변경되었습니다 : [Java 8 split에서 때때로 결과 배열의 시작에서 빈 문자열을 제거하는 이유는 무엇입니까?] (http : // stackoverflow. co.kr/q/22718744) – Tom

답변

0

제안 해 주셔서 감사합니다. 내 현재 해결 방법은 모의 배열을 사용하여 System.arraycopy()를 사용하여 새로운 배열로 복사하는 것입니다.

String[] mockLetters = word.split(""); 
int n = word.length(); 
String[] letters = new String[n]; 

System.arraycopy(mockLetters,1,letters,0,n); 

toCharArray()를 사용하는 것에 감사드립니다. 그러나 이러한 문자는 TextViews에 저장되고 TextView는 char을 허용하지 않습니다. 내가 할 수있는, 거친, 그것을 작동하게하지만 나는 내가 가진 것을 고수하기로 결정했습니다.

내 질문에 대한 답변에서 내 기본 문제에 대한 답변 : 왜 Java에서보다 String.split()이 Android에서 다르게 작동 했나요? 사항 String.split()에 대한

분명히 규칙은

+0

솔직히 그 결과를 보관하는 매우 느리고 비논리적 인 방법 – Divers

+0

toCharArray()를 사용하고 각 개별 문자를 String으로 캐스팅하여 textView에 넣을 수 있도록 제안 하시겠습니까? 그것은 훨씬 덜 비효율적 인 것처럼 보입니다. 또는 String을 개별 요소로 분리하여 textViews에 배치하는 더 좋은 방법이 있습니까? –

+0

사실 Regexp를 사용하면 항상 더 효율적입니다. 'toCharArray'는 매우 빠른 네이티브 메소드입니다. 당신이 나를 믿지 않는다면 - 단지 성능 테스트를하십시오. 그리고 솔직히 여기서 가장 큰 문제는 코드가 프로그래머의 대부분에게 매우 불명확하여 동료가 왜 그 일을하는지 이해하지 못한다는 것입니다. – Divers

-1

아래의 공백이 무시되도록 아래 문서 한도를 0으로 전달하십시오.

n은 다음 패턴을 가능한 한 많이 적용되어 제로의 경우

String[] split (String regex, int limit)

은 배열의 길이는, 후행 빈 문자열을 삭제한다.

public Character[] toCharacterArray(String s) { 

    if (s == null) { 
     return null; 
    } 

    int len = s.length(); 
    Character[] array = new Character[len]; 
    for (int i = 0; i < len ; i++) { 
     array[i] = new Character(s.charAt(i)); 
    } 

    return array; 
} 

을 대신의 구분없이 단어를 분할 :

+1

아니요, 작동하지 않습니다. – Divers

+1

아쉽게도이 결과가 반환됩니다. 그것은 어떤 차이도 만들지 못했습니다. –

1

난 당신이 이렇게 할 생각입니까?

도움이 되었기를 바랍니다.

+2

'String'에는'toCharArray'라는 내장 메소드가 있다는 것을 알고 계십니까? – childofsoong

0

당신이하고있는 일이 의미가 없기 때문에 그것이 버그인지 기대되는 행동인지 말하기 어렵습니다. 당신은 논리적 인 OR (문자열이 아니라 Regular expression을 기다리는 split) 문자열을 분리하려고합니다. 결과적으로 안드로이드는 일반적인 java와 비교할 때 결과가 다를 수 있으며 어떤 문제도 보이지 않습니다.

어쨌든 일반적인 방법으로 원하는 것을 성취 할 수있는 방법은 다양합니다. 그냥 한 사이클에있는 각 문자로 단어를 반복하거나 그냥 toCharArray 문자열의 방법을 사용합니다.

+0

표현식에 대해 잘못된 것이 없습니다. 정규 표현에 사용하는 유효한 캐릭터 라인. 그러나 파이프는 실제로 중복됩니다. 효과적으로 "빈 문자열 또는 빈 문자열 중 하나와 일치"라고 말하기 때문입니다. – Iain

+0

@lain 나는 그것이 잘못되었다고 말하지 않았다. 그런 식으로하는 것이 의미가 없다고 말했고, 프로그래머의 99 %는 예측할 수없는 속도로 느리다. – Divers