在链表上使用扫描器
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 值。其次,您通过使用 =
运算符而不是 ==
将 false
和 true
分配给 if
语句中的 sorted
变量。对于布尔值,避免此类错误的最简单方法是直接检查变量,而不是将其与 true
或 false
:
进行比较
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
是 分配 false
到 sorted
,然后使用 false
进行测试。所以测试总是会说列表已排序。
您应该使用 ==
而不是 =
。
然而,很多人(包括我自己)认为 variable == true
和 variable == 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。 (试试看...)
我的 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 值。其次,您通过使用 =
运算符而不是 ==
将 false
和 true
分配给 if
语句中的 sorted
变量。对于布尔值,避免此类错误的最简单方法是直接检查变量,而不是将其与 true
或 false
:
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
是 分配 false
到 sorted
,然后使用 false
进行测试。所以测试总是会说列表已排序。
您应该使用 ==
而不是 =
。
然而,很多人(包括我自己)认为 variable == true
和 variable == 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。 (试试看...)