1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/yangdechao_admin-guage-notes

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
38-算法机试题总结.md 15 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 24.06.2025 02:12 0782333

1. Различие между методами hasNext и hasNextLine в классе Scanner

В Java методы hasNext() и hasNextLine() являются частью класса Scanner и используются для проверки наличия данных в потоке ввода. Однако они различаются по своей функциональности и сценариям использования.

1. Функциональные различия

Метод hasNext()

Метод hasNext() используется для проверки наличия следующего токена в потоке ввода. Токен представляет собой последовательность символов, разделенных разделителями (по умолчанию это пробелы, табуляция, перевод строки и т.д.). Если в потоке ввода есть следующий токен, метод вернет true; в противном случае — false.

Метод hasNextLine()

Метод hasNextLine() используется для проверки наличия следующей строки в потоке ввода. Если в потоке ввода есть перевод строки, за которым следует хотя бы один символ, или если поток ввода еще не закончен, метод вернет true; в противном случае — false.

2. Различие в сценариях использования

Метод hasNext()

Метод hasNext() обычно используется для последовательного чтения токенов из потока ввода, таких как слова или числа. Ниже приведен пример, демонстрирующий чтение слов из ввода пользователя:

import java.util.Scanner;
``````java
public class HasNextExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Введите несколько слов, разделенных пробелами:");
        while (scanner.hasNext()) {
            String word = scanner.next();
            System.out.println("Вы ввели слово: " + word);
        }
        scanner.close();
    }
}
Тип документа для перевода: markdown
Язык исходного текста: английский
Язык финального текста: русский
```В этом примере метод `hasNext()` проверяет наличие следующего слова в потоке ввода, а затем использует метод `next()` для его чтения.

#### Метод `hasNextLine()`
Метод `hasNextLine()` часто используется для последовательного чтения строк из потока ввода, например, для чтения каждой строки из файла. Ниже приведен пример, демонстрирующий чтение строк из ввода пользователя:

```java
import java.util.Scanner;

public class HasNextLineExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Введите несколько строк, каждую в отдельной строке:");
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            System.out.println("Вы ввели строку: " + line);
        }
        scanner.close();
    }
}

В этом примере метод hasNextLine() проверяет, есть ли ещё следующая строка данных в потоке ввода, если да — использует метод nextLine() для чтения этой строки.

3. Подведение итогов

  • Метод hasNext() обращает внимание на маркеры в потоке ввода, что полезно при чтении данных, разделённых разделителями.
  • Метод hasNextLine() обращает внимание на строки в потоке ввода, что полезно при чтении данных построчно.

2. Различие между методами next() и nextLine() в классе Scanner

3. Преобразование типа Double в Long

В Java преобразование типа Double (оболочка) или double (базовый тип) в Long (оболочка) или long (базовый тип) требует учёта правил типовых преобразований и риска переполнения данных. Ниже приведены подробные методы преобразования и примечания:### 1. Преобразование базовых типов: doublelong

1. Прямое принудительное преобразование (отбрасывание дробной части)

double doubleNum = 3.9;
long longNum = (long) doubleNum; // Результат равен 3 (прямое отбрасывание дробной части, без округления)
  • Правила: При преобразовании с плавающей запятой в целочисленный тип, дробная часть отбрасывается, оставляется только целая часть (похоже на округление вниз, но с другим знаком).
    • Для положительных чисел: 3.9 → 3, 3.1 → 3.
    • Для отрицательных чисел: -3.9 → -3 (внимание: не -4, так как метод отбрасывает дробную часть, округляя к нулю).

2. Обработка переполнения и специальных значений

  • Переполнение: Если значение типа double выходит за пределы диапазона типа long (-9,223,372,036,854,775,808 до 9,223,372,036,854,775,807), результат преобразования не определен (может вызвать ошибку или вернуть неверное значение).

    double largeDouble = 1e19; // Выходит за пределы максимального значения типа long (9e18)
    long largeLong = (long) largeDouble; // Результат равен -4611686018427387904 (переполнение, результат неопределен)
  • Специальные значения:

    • Преобразование NaN в 0.
    • Преобразование положительной или отрицательной бесконечности в Long.MAX_VALUE или Long.MIN_VALUE.
    double nan = Double.NaN;
    long nanToLong = (long) nan; // 0
    double positiveInfinity = Double.POSITIVE_INFINITY;
    long infToLong = (long) positiveInfinity; // Long.MAX_VALUE (9223372036854775807)
    ```### 2. Преобразование оболочек: `Double`  `Long`

1. Сначала преобразование в базовый тип long, затем упаковка в Long

Double doubleObj = 5.7;
long primitiveLong = doubleObj.longValue(); // Вызов метода longValue(), эквивалентен (long) doubleObj

Долгое время longObj = примитивноеLong; // Автоматическое упаковывание

- **`Double.longValue()`**: Совпадает с приведением типов, возвращает отсечённое `long` значение.
#### 2. Использование `valueOf` или конструктора (не рекомендуется)
- **Неправильный способ**: Нельзя напрямую использовать `Long.valueOf(doubleObj)`, так как конструктор `Long` и метод `valueOf` принимают `String` или `long`, а не `Double`.
```java
// Ошибка! Нельзя скомпилировать
// Long longObj = Long.valueOf(doubleObj);
// Правильный подход: сначала преобразовать в базовый тип long
Long правильныйLongObj = Long.valueOf(примитивноеLong); // Аналогично прямому присваиванию, автоматическое упаковывание

3. Безопасное преобразование (рекомендуется)

1. Проверка значения на принадлежность диапазону long

Double двойнойЧисло = 9.223372036854775808E18; // равно Long.MAX_VALUE
if (двойнойЧисло >= Long.MIN_VALUE && двойнойЧисло <= Long.MAX_VALUE) {
    long безопасныйLong = (long) двойнойЧисло;
    System.out.println(безопасныйLong); // 9223372036854775807
} else {
    throw new ArithmeticException("Значение Double выходит за пределы диапазона Long");
}

2. Преобразование после округления (если требуется сохранение целочисленной точности)

Если требуется округление вместо простого отсечения, необходимо выполнить это вручную:

```java
double округленныйДвойной = 3.6;
long округленныйLong = Math.round(округленныйДвойной); // результат 4 (округление)

Четыре. Подведение итогов: шаги преобразования

Сценарий Метод преобразования Внимание
double -> long long longNum = (long) doubleNum; или doubleNum.longValue(); Прямое отсечение дробной части, может привести к потере точности; проверьте, находится ли значение в диапазоне long.
Double -> Long Сначала преобразуйте в базовый тип long, затем выполните автоматическое упаковывание: Long longObj = doubleObj.longValue(); Нельзя напрямую использовать конструктор Long для Double, необходимо пройти через базовый тип.
Преобразование после округления long округленныйLong = Math.round(doubleNum); Подходит для сценариев, требующих сохранения целочисленной точности (например, при конвертации валют).
Обработка больших значений / специальных значений Сначала используйте Double.isNaN(), Double.isInfinite(), затем проверьте диапазон.

Пять. Пример кода

public class DoubleToLongConversion {
    public static void main(String[] args) {
        // Преобразование примитивных типов: отсечение дробной части
        double truncateDouble = 7.9;
        long truncateLong = (long) truncateDouble;
        System.out.println("truncateLong: " + truncateLong);
        
        // Преобразование после округления
        double roundDouble = 3.6;
        long roundLong = Math.round(roundDouble);
        System.out.println("roundLong: " + roundLong);
        
        // Обработка больших значений / специальных значений
        double bigValue = Double.MAX_VALUE;
        if (!Double.isNaN(bigValue) && !Double.isInfinite(bigValue)) {
            long bigLong = (long) bigValue;
            System.out.println("bigLong: " + bigLong);
        } else {
            System.out.println("Значение слишком большое или не является числом.");
        }
    }
}
``````java
println("Отсечение дробной части: " + truncateLong); // Выводит 7
         // Преобразование объектов: longValue() + автоматическое упаковывание
         Double doubleObj = -3. 1;
         Long longObj = doubleObj.longValue(); // Эквивалентно (long) doubleObj
         System.out.println("Преобразование объектов: " + longObj); // Выводит -3
         // Преобразование с округлением
         double roundDouble = 5. 6;
         long roundLong = Math.round(roundDouble);
         System.out.println("Округление: " + roundLong); // Выводит 6
         // Обработка переполнения (пример: намеренное выход за пределы)
         double overflowDouble = 1e19;
         if (overflowDouble > Long.MAX_VALUE) {
             System.err.println("Ошибка: значение выходит за пределы типа Long!"); // Выводит сообщение об ошибке
         }
     }
 }
1.  **Потеря точности**: При преобразовании чисел с плавающей запятой в целые числа, дробная часть просто отбрасывается, а не округляется (кроме явного использования `Math.round`).
2.  **Проверка диапазона**: Для значений, которые могут превышать диапазон типа `long` (например, очень большие значения типа `double`), необходимо проверять диапазон заранее, чтобы избежать переполнения.
3.  **Обработка специальных значений**: При преобразовании значений `NaN` и бесконечностей требуется дополнительная проверка, чтобы избежать ошибок в бизнес-логике.

Выбор подходящего способа преобразования и добавление необходимых проверок в соответствии с требованиями бизнес-процесса гарантируют, что результат преобразования будет соответствовать ожиданиям.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/yangdechao_admin-guage-notes.git
git@api.gitlife.ru:oschina-mirror/yangdechao_admin-guage-notes.git
oschina-mirror
yangdechao_admin-guage-notes
yangdechao_admin-guage-notes
master