将令牌错误地传递给字符串数组

时间:2015-04-01 02:09:56

标签: java java.util.scanner

我正在编写一个程序,该程序读取作为main方法的参数传递的文本文件,并从文件中提取所有唯一的单词,并在控制台中每行打印一个。在从扫描仪读取每一行时,我无法将令牌传递给字符串数组:

我发现有些事情是错误的,或者可以用更有效的方式编写:

1)令牌被初始化为100.这是一个明显的约束,我想过使用像arrayList或vector这样的动态数组,但最终决定使用简单的字符串数组并简单地扩展数组(即创建一个新的数组double原始数组的大小,通过编写某种类型的条件语句来确定令牌是否填充了最大元素,但扫描程序仍然有更多行。

2)我不确定是否只是将input.hasNextLine()作为for循环中的测试语句传递是有意义的。只要输入已达到EOF

,我基本上想循环

3)我希望拆分中的正则表达式能够捕获所有标点符号,空格和数字,我不能100%确定它是否正确写入

4)有问题的行是tokens[index] = token[index],我不确定这是否正确。我希望将每行中的标记添加到标记中。

    public static void main(String[] arg) throws FileNotFoundException {
    File textFile = new File(arg[0]);
    String[] tokens = new String[100];

    try {

        Scanner input = new Scanner(textFile);

        for (int index = 0; input.hasNextLine(); index++) {
            String[] token = input.nextLine().split("[.,;']+\\d +\\s");
            tokens[index] = token[index];
        }
        for (String token : tokens) {
            System.out.println(token);
        }
        input.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:1)

代码中有几个错误,我将尝试涵盖所有错误:

  1. 将令牌更改为ArrayList,没有理由不
  2. 您需要两次迭代:a)文件中的行和b)行中的标记
  3. 正则表达式确实特定于令牌之间的内容(标点符号+一位数+空格+其他空格)

    public static void main(String[] arg) throws FileNotFoundException {
        File textFile = new File(arg[0]);
        ArrayList<String> tokens = new ArrayList<String>();
    
        try {
            Scanner input = new Scanner(textFile);
    
            while (input.hasNextLine()) {
                String[] lineTokens = input.nextLine().split("[,;:\"\\.\\s]+");
                for (String token : lineTokens) {
                    tokens.add(token);
                }
            }
            for (String token : tokens) {
                System.out.println(token);
            }
            input.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    
  4. 可以改进正则表达式,但这取决于你的数据,所以我无法知道你需要处理的所有情况。