您如何浏览 ArrayList 并使用 Scanner 查找 ArrayList 中的内容?



我正在制作一个汽车的ArrayList,我遇到了如何遍历ArrayList并使用扫描仪打印我要求的内容的问题。 示例:我正在列表中查找奥迪,我希望它浏览 ArrayList,如果它在 ArrayList 中,则打印"我们有 %s"。

这是我到目前为止所拥有的: 公共类 主 {

public static void main(String[] args) {
ArrayList<String> car = new ArrayList<>();
car.add("Audi");
car.add("Chevrolet");
car.add("Dodge");
car.add("Ford");
car.add("Honda");
car.add("Toyota");
car.add("Volkswagen");
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
for(String name: car)
{
if(name == sc){
System.out.printf("We have a %s.", sc);
}
}
}    

}

我认为这里真正的问题1是你对Scanner做什么没有清晰的了解。

Scanner从流中读取字符(例如System.in(并将它们转换为各种值;例如整数,浮点数,字符串等。 基本模型为:

  • 调用hasNextXXX测试是否有要读取的XXX
  • 拨打nextXXX阅读XXX

所以你试图从Scanner那里得到一个汽车制造商的名字. 假设汽车制造商名称中没有空格,您正在阅读的是一个以空格分隔的标记。 读取令牌的方法Scanner::next。 它将令牌作为删除任何前导或尾随空格的String返回。

旁白:String::nextLine也可以工作,除了它返回完整的行,其中包含用户在名称2之前或之后输入的所有空格。 例如,如果用户输入Ford后带有空格,则该值将与car列表中的值不匹配。 要解决这个问题,你需要做这样的事情:

String str = sc.nextLine().trim();  // 'trim' removes leading and 
// trailing whitespace; e.g. SP,
// TAB, CR and NL characters.

一旦你有了名字作为String,你应该String::equals将其与其他字符串进行比较。 在几乎所有情况下,使用==比较字符串都是不正确的;请参阅如何在 Java 中比较字符串?

为了更深入地了解Scanner,我建议您花时间阅读javadocs。


您的代码不执行上述操作。 相反,它读取一行(即str = sc.nextLine()(,并且不使用它。 然后,它使用==来测试Scanner是否等于列表中的每个String。 这失败了,因为Scanner不是String

旁白:在Java中,引用类型(即对象(的==意味着"这是同一个对象吗"。


1 - 另一种可能性是你没有足够仔细地阅读你编写的代码。

阿拉伯数字-。。。除了行分隔符序列;即 CR、NL 或 CR + NL。 这会自动删除nextLine:有关更多详细信息,请参阅 javadocs。

最新更新