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



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



например



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


результаты в массиве с "", "тест", "материал".



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




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


600   7  

7 ответов:

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

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()]);

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

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

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

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

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

Comments

    Ничего не найдено.