【问题标题】:String array list using Scanner使用 Scanner 的字符串数组列表
【发布时间】:2020-08-24 19:53:04
【问题描述】:

编辑:添加大括号 {} 和 Eclipse 屏幕截图

我有一个简单的分配问题来创建一个类,该类具有一个数组列表来存储命令行中的单词,每个单词都附加到数组列表的末尾,然后在列表中搜索特定的单词( "the") 并打印单词出现的位置,以及另一种返回新数组列表的方法,其中单词位于数字指定的位置。

我写了下面的代码。在 Eclipse IDE 中,它没有显示任何错误,但是当我尝试通过运行配置运行代码并输入以下虚拟文本时:“快速棕色狐狸跳过懒狗。快速棕色狐狸跳过懒狗。敏捷的棕色狐狸跳过了懒惰的狗。”,它不起作用。我不知道为什么,你能给我建议吗?谢谢!

import java.util.ArrayList;
import java.util.Scanner;
class Search {
    ArrayList<String> list;

    public Search(){
        list = new ArrayList<String>();
    }

    public void read(){
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()) {
            list.add(scanner.next());
        }
        scanner.close();
    }

    public void find(String word){
        for(int i = 0; i < list.size(); i++) {
            if(list.get(i).equalsIgnoreCase(word)) {
                System.out.println(i);
            }
        }
    }

    public ArrayList<String> subsequence(int[] positions){
        ArrayList<String> result = new ArrayList<String>();
        for(int i = 0; i < positions.length; i++) {
            if(positions[i] >= 0 && positions[i] < list.size()) {
                result.add(list.get(positions[i]));
            }   
        }
        return result;
    }

    // Testing method within class again
    public static void main(String[] args){
        Search search = new Search();
        search.read();
        search.find("the");
        for(String s : search.subsequence(new int[]{0, 3, 4}))
            System.out.println(s);

    }
}  

【问题讨论】:

  • 您好,欢迎您分享您的整洁外观和布局合理的代码。请让我们确切地知道当您尝试运行它时会发生什么,尽管我认为您可能会在多行块周围缺少大括号 {}。一般来说,即使只有一行,最好使用大括号圆形块,以避免将来有人添加一行时出现奇怪的错误
  • 另外,我对 Scanner 不太熟悉,但 hasNext 返回一行输入(由回车分隔)。如果是这样,您需要将其分解为单独的单词。
  • 我不认为缺少任何大括号,但是使用它们的建议仍然有效,尤其是在循环内有 if 块的地方令人困惑。我知道有缩进,但是当涉及到生产代码时,请记住,并不是每个使用你的代码的人都以相同的方式格式化它,安全地使用它,习惯使用大括号。那么你是一次输入一个单词,还是在敲回车之前输入整个句子?如果是后者,那可能是你的问题。如果有疑问添加一些 System.out.println,或者只是通过代码调试看看发生了什么
  • 谢谢你,克里斯,在你的建议中注明 - 我已经添加了 {},@DeepDalsania 也在下面解释了它:)
  • 您将它们作为参数传递,是的,但您没有在main 方法中使用args。相反,您尝试从标准输入中读取它。 tl;drsearch.list.addAll(Arrays.asList(args)); 而不是 search.read();

标签: java arraylist java.util.scanner


【解决方案1】:
  • 亲爱的@Chris 评论说,编码时请使用大括号。我以两种不同的方式运行您的代码并获得了输出。

  • 第一路

  • 如果您想将scanner.hashNext() 与while 一起使用,那么您应该像这样更改main()read()

    public static void main(String[] args) {
        Search search = new Search();
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        sc.close();
        search.read(line);
        search.find("the");
        for (String s : search.subsequence(new int[] { 0, 3, 4 })) {
            System.out.println(s);
        }
    }
    
    public void read(String line) {
            Scanner scanner = new Scanner(line).useDelimiter("\\s");
            while (scanner.hasNext()) {
                list.add(scanner.next());
            }
            scanner.close();
    }
    
    
  • 一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。
  • Scanner 使用分隔符模式将其输入分解为标记,默认情况下匹配空格。然后可以使用各种 next 方法将生成的标记转换为不同类型的值。

  • next()hasNext() 方法及其原始类型的伴随方法首先跳过与分隔符模式匹配的任何输入,然后尝试返回下一个标记。 hasNext()next() 都可能阻塞等待进一步的输入。 hasNext() 块是否与其关联的 next 方法是否会阻塞无关。

  • 第二种方式

  • 如果您想使用StringTokenizer,那么您只需将read() 更改为您现有的代码。

    public void read(String line) {
        Scanner scanner = new Scanner(System.in);
        StringTokenizer st = new StringTokenizer(scanner.nextLine(), " ");
        while (st.hasMoreElements()) {
            list.add(st.nextElement().toString());
        }
        scanner.close();
    }
    
  • 最好使用StringTokenizer 作为字符串。 StringTokenizer 类允许应用程序将字符串分解为标记。

  • StringTokenizer 对象在内部维护要标记化的字符串中的当前位置。一些操作将当前位置推进到处理的字符之后。通过获取用于创建 StringTokenizer 对象的字符串的子字符串来返回令牌。

参考ScannerStringTokenizer

【讨论】:

  • 非常感谢@Deep Dalsania!非常非常清楚的解释,我现在明白了!
  • @javanoob 我建议你使用第二种方式来更好地执行,你可以接受吗?
猜你喜欢
  • 2017-11-22
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
  • 2013-07-08
  • 2013-04-11
相关资源
最近更新 更多