Как предотвратить java.ленг.Строка.разделить () от создания ведущей пустой строки?
передача 0 в качестве предельного аргумента предотвращает завершение пустых строк, но как можно предотвратить ведущий пустые строки?
например
String[] test = "/Test/Stuff".split("/");
результаты в массиве с "", "тест", "материал".
Да, я знаю, что могу свернуть свой собственный токенизатор... но документы API для StringTokenizer говорят
"StringTokenizer-это устаревший класс, который сохраняется для совместимости
причины, хотя его использование не рекомендуется в новом код. Рекомендуется
что любой, кто ищет эту функциональность использовать сплит"
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на самом деле в нашей компании мы сейчас предпочитают использовать этот метод для разделения во всех наших проектах.
Я не думаю, что есть способ, которым вы могли бы сделать это со встроенным
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