Мне нужно ввести что-то вроде 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 называет это.
Лично я бы использовал String#split, но, если требования исключают, вы также можете использовать String#indexOf(int) или String#indexOf(int, int) или даже String#indexOf(String, int)
@MadProgrammer Итак, если я использую String # indexOf (int), я могу просто установить int для обновления, подсчитав пробелы?
@AlexanderWilde Это отчасти зависит, String#indexOf(int) вернет "первый" индекс символа (или -1, если он не существует), после этого я бы использовал String#indexOf(int, int) или его вариант, чтобы получить следующий пробел ПОСЛЕ указанного индекса.
Кто-то должен сказать следующее: стандартное соглашение Java гласит, что имена переменных (уровень класса, уровень экземпляра, параметр-метод, локальный) должны начинаться с буквы нижнего регистра. first = info.substring(0,x); и т.д.




Если он разделен пробелом, почему бы не использовать метод 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 ().
@AlexanderWilde, что это было?
Сравнение строк, синтаксический анализ, разбиение строки на две строки, символы с помощью некоторых методов (верхний, нижний и т. д.), Определение длины, пустые и нулевые строки и подстроки.
@AlexanderWilde Как они разбили String? Использование метода split() - это еще один способ разбить String.
Они использовали то, что я сделал выше. Они просто использовали метод длины, чтобы найти начало строки, затем первый пробел, а затем начали поиск второго слова в строке, используя первый пробел до конца строки.
Есть несколько способов разобрать этот 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. Я на долгий путь, чтобы сделать это прямо сейчас.
Итак, предполагая, что вам не разрешено использовать что-то вроде 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());
}
Это не связано с вашей проблемой
length(), но более простым решением было бы использоватьsplit(String regex).