Использование .length () в Java

Мне нужно ввести что-то вроде John Doe 12345 99, где имя - John, фамилия - Doe, идентификатор - 12345, а заработная плата - 99. Это должно быть все в одной строке, разделенной пробелами. Итак, у меня есть это:

  while(x < Info.length()){
      if (Info.charAt(x) == ' '){
          First = Info.substring(0,x);
          Last = Info.substring(x + 1, Info.length());
          IDNum = Integer.parseInt(Info.substring(x + 2, Info.length())); 
          Wage = Double.parseDouble(Info.substring(x + 3, Info.length()));
          x = Info.length();
      }
   ++x;
}

У меня проблемы с .length();. Пример в книге показал, как разбить строку, состоящую только из двух слов. Это длина на IDNum и Wage. Я не уверен, с чего начать и с чего закончить. Я думаю, что мне нужно изменить окончание length(), когда Last называет это.

Это не связано с вашей проблемой length(), но более простым решением было бы использовать split(String regex).

Gino Mempin 06.08.2018 01:54

Лично я бы использовал String#split, но, если требования исключают, вы также можете использовать String#indexOf(int) или String#indexOf(int, int) или даже String#indexOf(String, int)

MadProgrammer 06.08.2018 01:55

@MadProgrammer Итак, если я использую String # indexOf (int), я могу просто установить int для обновления, подсчитав пробелы?

Alexander Wilde 06.08.2018 01:57

@AlexanderWilde Это отчасти зависит, String#indexOf(int) вернет "первый" индекс символа (или -1, если он не существует), после этого я бы использовал String#indexOf(int, int) или его вариант, чтобы получить следующий пробел ПОСЛЕ указанного индекса.

MadProgrammer 06.08.2018 02:07

Кто-то должен сказать следующее: стандартное соглашение Java гласит, что имена переменных (уровень класса, уровень экземпляра, параметр-метод, локальный) должны начинаться с буквы нижнего регистра. first = info.substring(0,x); и т.д.

Stephen C 06.08.2018 03:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
82
4

Ответы 4

Если он разделен пробелом, почему бы не использовать метод split():

String info = "John Doe 12345 99";
String[] seperatedInfo = info.split(" ");
String firstName = seperatedInfo[0];
String lastName = seperatedInfo[1];
int ID = Integer.parseInt(seperatedInfo[2]);
double pay = Double.parseDouble(seperatedInfo[3]);
System.out.println(firstName);
System.out.println(lastName);
System.out.println(ID);
System.out.println(pay);

Выход:

John
Doe
12345
99

Также побочное примечание Соглашения об именах Java для переменных должны начинаться с нижнего регистра и использовать camelCase

Я знаю, что смотрел на стек, и это выглядело хорошей идеей. Это домашнее задание, и в этой главе ничего не говорилось об использовании split ().

Alexander Wilde 06.08.2018 01:53

@AlexanderWilde, что это было?

GBlodgett 06.08.2018 01:59

Сравнение строк, синтаксический анализ, разбиение строки на две строки, символы с помощью некоторых методов (верхний, нижний и т. д.), Определение длины, пустые и нулевые строки и подстроки.

Alexander Wilde 06.08.2018 02:03

@AlexanderWilde Как они разбили String? Использование метода split() - это еще один способ разбить String.

GBlodgett 06.08.2018 02:07

Они использовали то, что я сделал выше. Они просто использовали метод длины, чтобы найти начало строки, затем первый пробел, а затем начали поиск второго слова в строке, используя первый пробел до конца строки.

Alexander Wilde 06.08.2018 02:14

Есть несколько способов разобрать этот String, я бы начал с его анализа split; затем назначьте жетоны по желанию. Что-то вроде,

String info = "John Doe 12345 99";
String[] tokens = info.split("\\s+");
String first = tokens[0], last = tokens[1];
int id = Integer.parseInt(tokens[2]);
double wage = Double.parseDouble(tokens[3]);
System.out.printf("%d %s, %s %.2f%n", id, last, first, wage);

Какие выходы

12345 Doe, John 99.00

Заполнение tokens без split - это подход, которым я бы воспользовался, если бы у меня были ограниченные методы. Вы знаете, что есть четыре токена, и вы можете использовать последовательные вызовы indexOf(char) для поиска пробелов. Нравиться,

String info = "John Doe 12345 99";
int p = 0, c = 0;
String[] tokens = new String[4];
while (c < 4) {
    int p1 = (c != 3) ? info.indexOf(' ', p) : info.length();
    tokens[c] = info.substring(p, p1);
    p = p1 + 1;
    c++;
}

Остальную часть ответа менять не нужно.

Я могу использовать только циклы и операторы if, чтобы вытаскивать части из строки. Вроде разница между Pre-Calc и Calc. Я на долгий путь, чтобы сделать это прямо сейчас.

Alexander Wilde 06.08.2018 01:55

Итак, предполагая, что вам не разрешено использовать что-то вроде String#split, что было бы моим предпочтительным методом, вы могли бы вместо этого использовать функциональность indexOf, которая предоставляет несколько разных способов найти индекс данного символа. или String в String.

Итак, что-то вроде ...

String text = "John Doe 12345 99";
int index = text.indexOf(" ");
int lastIndex = 0;
while (index > -1) {
    String part = text.substring(lastIndex, index);
    System.out.println("[" + part + "]");
    lastIndex = index + 1;
    index = text.indexOf(" ", lastIndex);        
}
if (lastIndex != 0) {
    String part = text.substring(lastIndex);
    System.out.println("[" + part + "]");
}

распечатывает ...

[John]
[Doe]
[12345]
[99]

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

Предостережение: Это будет работать только для отдельных «пробелов», так что остерегайтесь этого. Вы также можете использовать String#trim для обрезки начальных и конечных пробелов, но вам потребуется вручную разобрать String (используя String#substring).

Вы также можете использовать класс StringTokenizer.

Пример:

    String str = "John Doe 12345 99";
    String delimeter = " ";
    StringTokenizer stringTokenizer = new StringTokenizer(str, delimeter);
    while (stringTokenizer.hasMoreTokens()) {
        System.out.println(stringTokenizer.nextToken());
    }

Другие вопросы по теме