Ага. nextToken()
сохраняет состояние, его вызов меняет ситуацию, поэтому использование его дважды в одной строке потребует два токена.
Мне кажется, что ваш второй фрагмент легче читать, поэтому я не уверен, в чем проблема является. Предположительно, вы хотите, чтобы ваш код был более читабельным.
Простое решение - создать вспомогательные методы:
while (fileLine.hasMoreTokens()) {
oneNumber = fetchHeadingNumber(fileLine);
twoString = fileLine.nextToken();
threeNumber = fetchHeadingNumber(fileLine);
fileLine.nextToken(); // no need to assign it.
fileLine.nextToken();
}
с помощью этого метода:
int fetchHeadingNumber(StringTokenizer t) {
String token = t.nextToken();
return Integer.parseInt(token.substring(0, token.indexOf('.')));
}
вы можете go еще дальше и создайте класс, представляющий строку, в которой есть весь код, необходимый для ее анализа (я придумал имена; ваш фрагмент не дает понять, что представляет собой эта строка):
@lombok.Value class InventoryItem {
int warehouse;
String name;
int shelf;
public static InventoryItem read(StringTokenizer tokenizer) {
int warehouse = num(tokenizer);
String name = tokenizer.nextToken();
int shelf = num(tokenizer);
tokenizer.nextToken();
tokenizer.nextToken();
return new InventoryItem(warehouse, name, shelf);
}
private static int num(StringTokenizer t) {
String token = t.nextToken();
return Integer.parseInt(token.substring(0, token.indexOf('.')));
}
}
, а затем чтение строки и получение, скажем, места, в котором она хранится, намного лучше: теперь у вещей есть имена!
InventoryItem item = InventoryItem.read(fileLine);
System.out.println("This item is in warehouse " + item.getWarehouse());
NB: Использует @ Value lombok чтобы в этом ответе не было слишком много шаблонов.