在链表上使用扫描器

Using a scanner on linked list

我的 class 中有一项任务是使用链表和返回布尔值的方法,表示真或假。该方法应该检查列表是否已排序(按时间顺序排序,例如 1、2、7、14)。

当我 运行 这个程序时,无论我的列表是否排序,我都没有得到任何答案。是我扫描仪用错了还是怎么回事?

package Kap18;

import java.util.*;
import javax.swing.*;

public class Lista {

public static void main(String[] args) {
        boolean sorted;
        
        System.out.println("Write a few numbers");
        Scanner sc = new Scanner(System.in);
        
        LinkedList<Integer> tab = new LinkedList<Integer>();
        
        while (sc.hasNextInt())
            tab.add(sc.nextInt());
        
        isSorted(tab);
        if (sorted = false){
            System.out.println("The list is not sorted");
        }
        else if (sorted = true){
            System.out.println("The list is sorted");
        }
        }
        
    public static boolean isSorted(LinkedList tab){
        boolean sorted = true;
        int i = 0;
        int num1 = (Integer)tab.get(i);
        int num2;
        for(i = 1; i <= tab.size() - 1; i++){
            num2 = (Integer)tab.get(i);
            if(num1 < num2){
                num1 = num2;
            }
            else{
                i = tab.size();
                sorted = false;
            }
        }
        return sorted;
    }

这里有一些问题。首先,您忽略 isSorted 的 return 值。其次,您通过使用 = 运算符而不是 ==falsetrue 分配给 if 语句中的 sorted 变量。对于布尔值,避免此类错误的最简单方法是直接检查变量,而不是将其与 truefalse:

进行比较
sorted = isSorted(tab);
if (sorted) {
    System.out.println("The list is sorted");
}
else if (sorted = true){
    System.out.println("The list is not sorted");        
}

你的问题是 sorted = false 分配 falsesorted,然后使用 false 进行测试。所以测试总是会说列表已排序。

您应该使用 == 而不是 =

然而,很多人(包括我自己)认为 variable == truevariable == false 是 Bad Style;例如参见 。原因是使用 == 留下了一个字符打字错误 的可能性,这只会伤害你 ;即,将 == 错误输入为 =.

(在布尔表达式中使用==!=也是多余的在大多数情况下。但不是全部。)

所以,我会说最好的写法是:

    if (!sorted) {
        System.out.println("The list is not sorted");
    }
    else {
        System.out.println("The list is sorted");
    }

或者反过来,这样你就不需要取反 sorted 变量。


第二个问题是 sorted 一开始就没有设置,因为您没有将 isSorted 调用的结果分配给任何东西。

通常在分配之前使用 sorted 会出现编译错误。但在这种情况下,if 语句正在为 sorted 赋值 ... 由于之前的错误。


最后,在列表为空的情况下,isSorted有一个bug。 (试试看...)