Подтвердить что ты не робот

Как предотвратить java.lang.String.split() от создания ведущей пустой строки?

передача 0 в качестве предельного аргумента предотвращает завершение пустых строк, но как предотвратить предотвращение ведущих пустых строк?

например

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

приводит к массиву с параметрами "," Test "," Stuff".

Да, я знаю, что могу перевернуть свой собственный токенизатор... но API-документы для StringTokenizer говорят

"StringTokenizer - это унаследованный класс, который сохраняется для совместимости хотя его использование не рекомендуется в новом коде. Рекомендуется что любой, кто ищет эту функциональность, использует раскол"

4b9b3361

Ответ 1

Лучше всего, наверное, просто снять любой ведущий разделитель:

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", "/");

Ответ 2

Apache Commons имеет метод утилиты для этого: org.apache.commons.lang.StringUtils.split

StringUtils.split()

Фактически в нашей компании мы теперь предпочитаем использовать этот метод для разделения во всех наших проектах.

Ответ 3

Я не думаю, что вы можете сделать это с помощью встроенного метода 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);

Ответ 4

Я думаю, что нет встроенной функции для удаления пустой строки в 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()]);

Ответ 5

Вы можете использовать StringTokenizer для этой цели...

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

Ответ 6

Я думаю, вам придется вручную удалить первую пустую строку. Простой способ сделать это -

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

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

  test = subString.split("/"); 

Это исключает ведущую пустую строку.

Ответ 7

Вот как я обошел эту проблему. Я беру строку, вызываю .toCharArray() на ней, чтобы разбить ее на массив символов, а затем пропустить этот массив и добавить его в список String (обертывая каждый char с помощью String.valueOf). Я предполагаю, что есть некоторые компромиссы с производительностью, но это похоже на читаемое решение. Надеюсь это поможет!

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

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