Java中的哨兵值及示例

学习关于Java中的哨兵值,以及使用哨兵控制的while循环和do-while循环示例,了解它们如何检测输入结束。
On this page

Java中的哨兵值及示例

在编程中,哨兵值是一种特殊的值,用于检测数据输入的结束,当实际的结束点是未知的时候。哨兵值提供了一种灵活和方便的方式来终止循环,其中迭代的次数事先不确定。

什么是哨兵值?

哨兵值,也称为标志值或者终止值, 是一个特殊的值,用于标记数据输入的终点。它通常用于终止像 Java 中的while 循环do-while 循环等无限循环。

以下是哨兵值的一些关键特征:

  • 它们表示来自外部源(如用户键盘或文件)的数据输入完成。

  • 它们应该是实际数据的无效值,但具有相同的数据类型。例如,对于数值数据是-1,对于字符串数据是"quit"。

  • 它们允许循环根据动态用户输入执行任意次数,而不是具有预定义的固定迭代次数。

  • 一旦遇到哨兵值,循环就会结束执行并移动到下一步。

  • 哨兵值提供了一种简单的机制,以优雅的方式终止具有可变迭代次数的循环。

在 Java 中使用数字的哨兵值示例

下面是一个完整的 Java 程序,演示了使用哨兵值来求用户输入的整数的和:

 1import java.util.Scanner;
 2
 3public class SentinelValueSum {
 4
 5  public static void main(String[] args) {
 6
 7    int number, sum = 0;
 8
 9    Scanner input = new Scanner(System.in);
10
11    System.out.print("Enter positive integers to sum (enter 0 to quit): ");
12
13    // 0 is used as the sentinel value
14    number = input.nextInt();
15
16    // Keep reading numbers until the sentinel value is input
17    while(number != 0) {
18
19      // Add valid number to sum
20      sum += number;
21
22      // Prompt for next integer
23      System.out.print("Enter another integer (enter 0 to quit): ");
24
25      // Read next number
26      number = input.nextInt();
27    }
28
29    // Print final sum
30    System.out.println("The sum of all entered numbers is: " + sum);
31
32  }
33
34}

在这个示例中,整数 0 被用作哨兵值来标记输入的结束。

关键步骤如下:

  1. 将 sum 初始化为 0,用于存储累加结果。

  2. 使用Scanner 类从用户读取第一个整数到 number 变量中。

  3. 开始一个while 循环,条件为number != 0

  4. 在循环内,将每个有效的输入数字加到 sum 变量中。

  5. 提示用户输入下一个数字,并再次将输入读取到 number 变量中。

  6. 当 number 变为 0 时,while 循环终止。

  7. 最后,打印出用户的总和。

这使得用户可以自由地输入任意数量的有效整数,并通过输入哨兵值 0 来终止输入过程。循环根据用户的输入次数运行。

在 Java 中使用字符串的哨兵值示例

我们可以将哨兵值的概念应用到输入字符串中:

 1import java.util.Scanner;
 2
 3public class SentinelValueString {
 4
 5  public static void main(String[] args) {
 6
 7    String name;
 8
 9    Scanner input = new Scanner(System.in);
10
11    System.out.print("Enter names (enter 'quit' to end): ");
12
13    // 'quit' is used as the sentinel value
14    name = input.nextLine();
15
16    // Keep reading names until sentinel value is entered
17    while(!name.equals("quit")) {
18
19      // Process name
20
21      System.out.print("Enter next name (enter 'quit' to end): ");
22      name = input.nextLine();
23    }
24
25  }
26
27}

在这个示例中,字符串"quit"被用作哨兵值来终止循环。循环将继续读取用户输入的名称,直到输入"quit"为止。

一些关键点:

  • 使用equals()方法将输入字符串与哨兵值进行比较。
  • 使用!=来检查不相等的条件。
  • 使用nextLine()来读取输入,而不是使用nextInt()

这允许用户输入任意数量的名称,直到输入哨兵值为止。

使用哨兵值的优势

使用哨兵值作为循环终止的一些好处:

  • 与固定计数相比,它们提供了一种优雅的方式来终止循环。

  • 根据需求,循环可以执行任意次数。

  • 用户可以控制何时结束输入。

  • 在循环内避免重复提示输入。只在循环开始之前提示一次。

  • 防止读取超出实际数据的错误。

  • 哨兵值检查优雅地替代了传统的循环条件。

  • 可以用于数字和字符串输入。

  • 在具有动态迭代的循环中使用的简单技术。

哨兵控制循环与计数控制循环之间的区别是什么?

主要区别是:

  • 在计数控制循环中,迭代次数是预定义的,并且基于计数器变量。

  • 在哨兵控制循环中,迭代次数不固定,而是取决于输入数据。循环运行直到遇到哨兵值。

例如:

1// Count controlled loop
2for (int i = 0; i < 5; i++) {
3  ...
4}
5
6// Sentinel controlled loop
7while (!name.equals("quit")) {
8  ...
9}

for 循环有 5 次固定迭代,而 while 循环基于用户输入和哨兵值进行迭代。

当迭代次数无法预先确定并且取决于外部数据时,哨兵控制循环非常有用。另一方面,计数控制循环在我们事先知道确切的迭代次数时非常有用。

选择一个合适的哨兵值

哨兵值应该谨慎选择为永远不会出现在实际输入数据中的值。

对于数值数据,当输入范围严格为正值时,负值如-1 适用。

对于字符串数据,像"quit"、“end”、“exit"这样的值作为哨兵值非常合适。

一个好的哨兵值的理想特点:

  • 与输入数据的数据类型匹配。

  • 与任何有效/实际输入值都不相同。

  • 可以识别并表示输入结束。

  • 简单的值易于测试。

概要

  • 哨兵值为控制未知迭代次数的无限循环提供了一种简单而强大的方式。

  • 它们消除了在循环内多次提示输入的需求。

  • 哨兵值清楚地指示程序用户输入已经完成。

  • 广泛使用的示例是数字数据的 0 和字符串数据的“quit”。

  • 在 Java 中,哨兵值可以极大地简化循环终止逻辑。

总之,哨兵值是一种非常有用的技术,用于根据输入来终止具有可变或未知迭代次数的循环,而不是通过固定次数来控制循环。