Java 使用扫描器的字符串数组列表

Java 使用扫描器的字符串数组列表,java,arraylist,java.util.scanner,Java,Arraylist,Java.util.scanner,编辑:添加大括号{}和Eclipse屏幕截图 我在一个简单的赋值中遇到了一个问题:创建一个类,该类有一个数组列表来存储命令行中的单词,每个单词都附加到数组列表的末尾,然后在列表中搜索特定的单词(“the”),并打印单词出现的位置,再加上另一个方法,返回一个新的数组列表,其中的单词位于数字指定的位置 我写了下面的代码。在EclipseIDE中,它没有显示任何错误,但当我试图通过运行配置运行代码并输入以下伪文本时:“快速棕色狐狸跳过懒狗。快速棕色狐狸跳过懒狗。快速棕色狐狸跳过懒狗。”,它不起作用。我

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

我在一个简单的赋值中遇到了一个问题:创建一个类,该类有一个数组列表来存储命令行中的单词,每个单词都附加到数组列表的末尾,然后在列表中搜索特定的单词(“the”),并打印单词出现的位置,再加上另一个方法,返回一个新的数组列表,其中的单词位于数字指定的位置

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

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);

    }
}  
import java.util.ArrayList;
导入java.util.Scanner;
类搜索{
数组列表;
公开检索(){
列表=新的ArrayList();
}
公共无效读取(){
扫描仪=新的扫描仪(System.in);
while(scanner.hasNext()){
list.add(scanner.next());
}
scanner.close();
}
公共void查找(字符串字){
对于(int i=0;i=0&&positions[i]

  • 亲爱的
    @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()
    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对象的字符串的子字符串来返回标记


参考:和

大家好,欢迎并感谢分享您整洁的代码。请让我们确切地知道当您尝试运行它时会发生什么,尽管我想您可能会告诉我多行块周围缺少大括号{}。一般来说,即使只有一行,使用大括号圆块也是一种很好的做法,以避免将来有人添加一行时出现奇怪的错误。因此,我对扫描仪不太熟悉,但它确实会返回一行输入(由回车分隔)。如果是这样的话,你需要把它分成几个单独的单词。我不认为有任何大括号缺失,但使用大括号的建议仍然有效,尤其是在循环中有If块的地方。我知道有缩进,但当涉及到生产代码时,请记住,并不是每个拿起代码的人都以相同的方式对其进行格式化,请注意安全,习惯使用大括号。那么,你是一次输入一个单词,还是在按enter键之前输入整个句子?如果是后者,那可能是你的问题。如果有疑问,请添加一点System.out.println,或者只是通过代码调试看看发生了什么。谢谢你,克里斯,根据你的建议,我已经添加了{},并且@DeepDalsania也在下面解释过:)你可以将它们作为参数传递,是的,但是你不能在
main
方法中使用
args
。相反,您尝试从标准输入读取它。tl;dr:
search.list.addAll(Arrays.asList(args))而不是
search.read()非常感谢@Deep Dalsania!非常非常清楚的解释,我现在明白了@javanoob我建议您使用第二种方法来更好地执行,这是您可以接受的答案吗?