#java #java.util.scanner
#java #java.util.scanner
Вопрос:
Вопрос:
У меня есть этот набор чисел в документе .txt, который я хочу использовать java.util.Scanner
для определения перевода строки между 123
, 456
, и 789
, распечатать числа между переводами строк, есть ли какой-нибудь способ сделать это?
1 2 3
// n here
4 5 6
// n here
7 8 9
Вывод:
456
===========================================================================
Решения, которые я пробовал:
(1) Я попытался использовать метод hasNextLine(), однако, похоже, что hasNextLine() сообщит мне, есть ли токены в следующей строке, и вернет логическое значение вместо того, чтобы сообщить мне, есть ли n . if (scan.hasNextLine()) { \ do something }
(2) Я также пытался использовать: (Однако при использовании такого условия будет указано «Синтаксическая ошибка в токене «Недопустимый символ»»)
Scanner scan = new Scanner(new File("test.txt"));
// create int[] nums
while (scan.hasNext()) {
String temp = scan.next();
if (temp == n) {
// nums.add(); something like this
}
}
System.out.print(nums); // something like this
Я думаю использовать n
в качестве разделителей
ps. Я сделал Google, и большинство результатов подсказывают мне использовать .hasNextLine() , но я хочу, чтобы он идентифицировал перевод строки ( n)
Комментарии:
1. Возможно, сканер автоматически использует пробелы.
2. Просто читать строку за раз с помощью nextLine?
3. Вы говорите, что хотите определить перевод строки . Вместо этого думайте об этом как о пустой строке или строке нулевой длины . Продолжайте и попробуйте
nextLine()
. Или замените и используйте вместо.Scanner
BufferedReader
4. @KevinAnderson Мой учитель не хочет использовать
java.io.BufferedReader
, потому что он только училjava.util.Scanner
5. @EvanKnowles Сканер фактически пропустит n и вместо этого напечатает строку с токенами.
Ответ №1:
Scanner
сканирует следующий элемент, используя new-line
или whitespace
в качестве разделителя по умолчанию. Чтобы позволить ему читать весь контент, используйте scan.useDelimiter("\Z")
.
Scanner scan = new Scanner(new File("test.txt"));
scan.useDelimiter("\Z");
final String content = scan.next(); // content: "1 2 3rnrn4 5 6"
int index = 0;
System.out.println("Index of \n");
while (index != -1) {
index = content.indexOf("n", index);
if (index != -1) {
System.out.println(index);
// Or do whatever you wish
index ;
}
}
Вывод:
Index of n
5
7
Комментарии:
1.
indexOf()
возвращает-1
, когда не может найти"n"
.0
указывает начальный индекс совпадения.2. Понятно, интересно, почему результат имеет 7, а 6 — наибольшее число в содержимом?
3. @FlashSonic526, в его примере 2
n
:"1 2 3rnrn4 5 6"
— 5 и 7 представляют индексn
в этой строке.4. Интересно, вы создали
n
строку? Разве индекс не отсчитывается от 0?
Ответ №2:
Я не уверен, что на 100% понимаю ваш вопрос. Поэтому я предполагаю, что в вашем файле всегда будет 2 строки, разделенные ТОЛЬКО ОДНОЙ новой строкой ( n
) . Если я ошибаюсь, пожалуйста, сообщите об этом.
String charsAfterNewLine = null;
//try-catch block with resources
//Scanner need to be closed (scan.close()) after finish with it
//this kind of block will do `scan.close()` automatically
try(Scanner scan = new Scanner(new File("test.txt"))){
//consume(skip) first line
if(scan.hasNextLine()){
scan.nextLine();
}else{
throw new Exception("File is empty");
}
//get second line
if(scan.hasNextLine()){
charsAfterNewLine = scan.nextLine();
}else{
throw new Exception("Missing second line");
}
}catch(Exception e){
e.printStackTrace();
}
System.out.println("charsAfterNewLine: " charsAfterNewLine);
Если вы хотите простой способ, без try-catch:
String charsAfterNewLine = null;
//throws FileNotFoundException
Scanner scan = new Scanner(new File("test.txt"));
if(scan.hasNextLine()){
//consume(skip) first line
scan.nextLine();
if(scan.hasNextLine()){
//get second line
charsAfterNewLine = scan.nextLine();
}else{
System.out.println("Missing second line");
}
}else{
System.out.println("File is empty");
}
scan.close();
System.out.println("charsAfterNewLine: " charsAfterNewLine);
Результаты (для обоих):
Input:
(empty file)
Output:
File is empty
charsAfterNewLine: null
-----
Input:
1 2 3 4 5 6
Output:
Missing second line
charsAfterNewLine: null
-----
Input:
1 2 3n4 5 6
Output:
charsAfterNewLine: 4 5 6
Комментарии:
1. Спасибо за ваш ответ, ваша рекомендация сработала в моем первоначальном вопросе. Однако, по мере продвижения вперед, я должен немного пересмотреть свой вопрос. Пожалуйста, любезно сообщите дальше с благодарностью.
2. @FlashSonic526, можешь ли ты также показать вывод для этого ввода? Будет проще понять ваш вопрос.
3. Я только что обновил вопрос для ясности, посмотрите, помогает ли это? Спасибо!
4. @FlashSonic526, код должен работать. Даже
1 2 3n4 5 6n7 8 9
если он все еще печатает4 5 6
. Для кода требуется минимум 2 строки. Если у него более 2 строк, это не имеет значения. Он читает только первые 2 строки, а остальные игнорируются.
Ответ №3:
while (scanner.hasNext()) {
String data = scanner.nextLine();
System.out.println("Data: " data);
if (data.isEmpty()) {
System.out.println("Found it");
break;
}
}
Комментарии:
1. Строковые данные будут считывать каждую строку одну за другой и сохранять всю строку в строке, а затем проверять, является ли эта строка emty.
2. это сработало, но разве
scanner
n
по умолчанию не будет пропущено?3. Привет и добро пожаловать в StackOverflow. Пожалуйста, при ответе на вопрос не публикуйте только код. Добавьте также объяснение того, что делает ваш код, и почему вы считаете, что ваш ответ подходит для вопроса.
4. @MarioCodes Этот фрагмент кода просто прочитает каждую строку в файле и сохранит эту строку в виде строки, а затем проверит, пуста ли эта строка, используя .isEmpty() .
5. Не просто отвечайте мне в качестве комментария, добавьте его в свой ответ для завершения