program story

java.lang.String.split ()이 선행 빈 문자열을 만드는 것을 방지하는 방법은 무엇입니까?

inputbox 2021. 1. 8. 08:12
반응형

java.lang.String.split ()이 선행 빈 문자열을 만드는 것을 방지하는 방법은 무엇입니까?


제한 인수로 0을 전달하면 후행 빈 문자열이 방지되지만 선행 빈 문자열을 어떻게 방지 합니까?

예를 들어

String[] test = "/Test/Stuff".split("/");

"", "Test", "Stuff"가있는 배열이 생성됩니다.

그래, 나만의 Tokenizer를 굴릴 수 있다는 것을 알고 있지만 StringTokenizer의 API 문서는

"StringTokenizer는 새 코드에서는 사용을 권장하지 않지만 호환성을 위해 유지되는 레거시 클래스입니다.이 기능을 원하는 사람은 분할을 사용하는 것이 좋습니다."


가장 좋은 방법은 선행 구분 기호를 제거하는 것입니다.

String input = "/Test/Stuff";
String[] test = input.replaceFirst("^/", "").split("/");

메서드에 넣어서 좀 더 일반적으로 만들 수 있습니다.

public String[] mySplit(final String input, final String delim)
{
    return input.replaceFirst("^" + delim, "").split(delim);
}

String[] test = mySplit("/Test/Stuff", "/");

Apache Commons에는 정확히이를위한 유틸리티 메소드가 있습니다. org.apache.commons.lang.StringUtils.split

StringUtils.split ()

실제로 우리 회사에서는 모든 프로젝트를 분할하는 데이 방법을 사용하는 것을 선호합니다.


내장 된 split방법으로 이것을 할 수있는 방법이 없다고 생각 합니다. 따라서 두 가지 옵션이 있습니다.

1) 나만의 분할 만들기

2) split을 호출 한 후 배열을 반복하고 빈 요소를 제거합니다.

나만의 분할을하는 경우이 두 가지 옵션을 결합 할 수 있습니다.

public List<String> split(String inString)
{
   List<String> outList = new ArrayList<>();
   String[]     test    = inString.split("/");

   for(String s : test)
   {
       if(s != null && s.length() > 0)
           outList.add(s);
   }

   return outList;
}

또는 split을 호출하기 전에 구분 기호가 첫 번째 위치에 있는지 확인하고 첫 번째 문자를 무시할 수 있습니다.

String   delimiter       = "/";
String   delimitedString = "/Test/Stuff";
String[] test;

if(delimitedString.startsWith(delimiter)){
    //start at the 1st character not the 0th
    test = delimitedString.substring(1).split(delimiter); 
}
else
    test = delimitedString.split(delimiter);

첫 번째 빈 문자열을 수동으로 제거해야한다고 생각합니다. 이를 수행하는 간단한 방법은 다음과 같습니다.

  String string, subString;
  int index;
  String[] test;

  string = "/Test/Stuff";
  index  = string.indexOf("/");
  subString = string.substring(index+1);

  test = subString.split("/"); 

이것은 선행 빈 문자열을 제외합니다.


Java에서 빈 문자열을 제거하는 내장 기능이 없다고 생각합니다. 빈 삭제 문자열을 제거 할 수 있지만 오류가 발생할 수 있습니다. 안전을 위해 다음과 같이 작은 코드를 작성하여이를 수행 할 수 있습니다.

  List<String> list = new ArrayList<String>();

  for(String str : test) 
  {
     if(str != null && str.length() > 0) 
     {
         list.add(str);
     }
  }

  test = stringList.toArray(new String[list.size()]);

You can use StringTokenizer for this purpose...

String test1 = "/Test/Stuff";
        StringTokenizer st = new StringTokenizer(test1,"/");
        while(st.hasMoreTokens())
            System.out.println(st.nextToken());

This is how I've gotten around this problem. I take the string, call .toCharArray() on it to split it into an array of chars, and then loop through that array and add it to my String list (wrapping each char with String.valueOf). I imagine there's some performance tradeoff but it seems like a readable solution. Hope this helps!

 char[] stringChars = string.toCharArray(); 
 List<String> stringList = new ArrayList<>(); 

 for (char stringChar : stringChars) { 
      stringList.add(String.valueOf(stringChar)); 
 }

ReferenceURL : https://stackoverflow.com/questions/9389503/how-to-prevent-java-lang-string-split-from-creating-a-leading-empty-string

반응형