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

String tokenizer в Java

У меня есть текстовый файл, который содержит данные, разделенные '|'. Мне нужно получить каждое поле (разделенное "|" ) и обработать его. Текстовый файл может быть показан ниже:

ABC | DEF || FGHT

Я использую строковый токенизатор (JDK 1.4) для получения каждого значения поля. Теперь проблема в том, что я должен получить пустую строку после DEF. Однако я не получаю пустое пространство между DEF и FGHT.

Мой результат должен быть ABC, DEF, "", FGHT, но я получаю ABC, DEF, FGHT

4b9b3361

Ответ 1

Из StringTokenizer документации:

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

Следующий код должен работать:

String s = "ABC|DEF||FGHT";
String[] r = s.split("\\|");

Ответ 2

Используйте флаг returnDelims и проверьте два следующих вхождения разделителя:

String str = "ABC|DEF||FGHT";
String delim = "|";
StringTokenizer tok = new StringTokenizer(str, delim, true);

boolean expectDelim = false;
while (tok.hasMoreTokens()) {
    String token = tok.nextToken();
    if (delim.equals(token)) {
        if (expectDelim) {
            expectDelim = false;
            continue;
        } else {
            // unexpected delim means empty token
            token = null;
        }
    }

    System.out.println(token);
    expectDelim = true;
}

это печатает

ABC
DEF
null
FGHT

API не довольно и, следовательно, считается устаревшим (т.е. "почти устаревшим" ). Используйте его только там, где сопоставление шаблонов слишком дорого (что должно быть только для чрезвычайно длинных строк) или где API ожидает перечисление.

Если вы переключитесь на String.split(String), обязательно укажите разделитель. Либо вручную ("\\|"), либо автоматически используя string.split(Pattern.quote(delim));

Ответ 3

StringTokenizer игнорирует пустые элементы. Рассмотрим использование String.split, который также доступен в версии 1.4.

Из javadocs:

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

Ответ 4

вы можете использовать конструктор, который берет дополнительную логику returnDelims и передает ей true. таким образом вы получите разделители, которые позволят вам обнаружить это условие.

В качестве альтернативы вы можете просто реализовать свой собственный токенизатор строк, который делает то, что вам нужно, это не так сложно.

Ответ 5

Это просто, как это...

    import java.util.StringTokenizer;

    class stringtoken{
        public static void main (String args[]){

            String s1 = "StringTokenizer by Himal";

            StringTokenizer stt = new StringTokenizer(s1," ");

            while (stt.hasMoreTokens()){
                String token = stt.nextToken();
                System.out.println(token);
            }
        }
    }

Результат:

    StringTokenizer
    by
    Himal

Ответ 6

пакет com.java.String;

импортировать java.util.StringTokenizer;

открытый класс StringWordReverse {

public static void main(String[] kam) {
    String s;
    String sReversed = "";
    System.out.println("Enter a string to reverse");
    s = "THIS IS ASHIK SKLAB";
    StringTokenizer st = new StringTokenizer(s);


    while (st.hasMoreTokens()) {
        sReversed = st.nextToken() + " " + sReversed;
    }

    System.out.println("Original string is : " + s);
    System.out.println("Reversed string is : " + sReversed);

}

}

Вывод:

Введите строку для обратного

Оригинальная строка: ЭТО ТАКОЕ ASHIK SKLAB

Перевернутая строка: SKLAB ASHIK ЭТОТ

Ответ 7

Вот еще один способ решить эту проблему.

   String str =  "ABC|DEF||FGHT";
   StringTokenizer s = new StringTokenizer(str,"|",true);
   String currentToken="",previousToken="";


   while(s.hasMoreTokens())
   {
    //Get the current token from the tokenize strings
     currentToken = s.nextToken();

    //Check for the empty token in between ||
     if(currentToken.equals("|") && previousToken.equals("|"))
     {
        //We denote the empty token so we print null on the screen
        System.out.println("null");
     }

     else
     {
        //We only print the tokens except delimiters
        if(!currentToken.equals("|"))
        System.out.println(currentToken);
     }

     previousToken = currentToken;
   }