需要使用扫描仪来阅读文件,但不知道如何比较

时间:2014-05-18 22:05:51

标签: java arrays

我正在尝试编写一种方法,使用Scanner读取文本文件,然后比较它们以查看它们是否为字符(' a' - ' z')但是二元运算符可以&# 39;使用(编译错误)。任何想法如何解决它?

我需要将大写字母转换为小写字母,并且我有一个计数器可以跟踪每个字母出现在文本文件中的次数。

我还需要忽略文本文件中的任何符号和数字。


阅读完评论后,我将代码更改为:

import java.util.Scanner;

public class LetterInventory {
    int counter = 0;
    private int[] inventory;

    char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray();

    public LetterInventory () {
        inventory = new int[26];
    }

    public void countOccurrences(Scanner file) {
        while (file.hasNextLine()) {
            // Read line by line and make it lowercase
            String line = file.nextLine().toLowerCase();       

            // get all the character of the line
            for (char c :line.toCharArray()) {
                if (c >= 'a' && c <= 'z'){    // Check for character only
                    counter++;
                }
            }
        }
    }

    public void displayTable () {
        for (int i = 0; i < alphabet.length; i++) {
                System.out.println(alphabet[i] + ":  " + inventory[i]);
            }
        }

    public void resetInventory () {
        counter = 0;
    }

我仍然不确定如何让这件事发挥作用。 该程序应该能够读取文本文件,对每个字母表进行读取计数,忽略任何符号/数字,并输出一个表格,每个字母后跟它们在文本文件中的次数。

4 个答案:

答案 0 :(得分:0)

为什么不使用正则表达式,而不是将file.next()char进行比较? 例如:

    if(file.next().matches("[a-z]")){
      //do something
}
如果下一个方法拾取的下一个值是a和z之间的小写字符,

将返回true。这样您就不必处理不必要的逻辑,也不必担心是否要将Stringchar进行比较。

请注意: 我不确定你的输入是什么,并且上面的正则表达式只会匹配,如果它是一个小写字母而不是它是一个单词。如果您正在阅读单词,则需要在使用上述解决方案之前将它们拆分为字符数组。


举个例子,你可以尝试这样的事情:

while (file.hasNext()) {
            // grabs next word/string from file
            String str = file.next().toLowerCase();
            // converts that string to a character array
            char[] charArray = str.toCharArray();

            for (char chars : charArray) {
                // converts current character into a string and checks whether
                // it
                // is a lower case letter
                if (String.valueOf(chars).matches("[a-z]")) {
                    // do something
                }
            }
        }

答案 1 :(得分:0)

阅读内联评论以获取更多信息。

while (file.hasNextLine()) {
    // Read line by line and make it lowercase
    String line = file.nextLine().toLowerCase();       

    // get all the character of the line
    for (char c : line.toCharArray()) {
        if (c >= 'a' && c <= 'z'){   // check for character only
            inventory[c - 'a']++;    // Increment the occurrence of the Character
        }            
    }
}

答案 2 :(得分:0)

正如评论中指出的那样,您的代码存在一些问题。 第一:每次调用file.next()时,它都会尝试读取下一个字符。所以你在循环中做的是:读取所有字符,转换为小写但忽略这个新值并继续。

编译问题是由于您尝试将字符串与字符进行比较。

你想要做的是这样的事情:

while(file.hasNext())
{
    String currentTokes = file.next().toLowerCase(); //save the current token as lower text in the variable
    //check each character of the string
    for(char c : currentToken.toCharArray())
    {
         if(c <= ....) //check etc.
    }

}

另一种方法是使用正则表达式。

答案 3 :(得分:0)

这将起作用

    public void countOccurrences(Scanner file) {
    int[] alpha = new int[25];
    while (file.hasNext()) {
        char[] stringTokens = file.next().toLowerCase().toCharArray();
        for (char c : stringTokens) {
            if (c - 'a' > -1 || c - 'a' < 26) {
                alpha[c - 'a']++;
            }
        }

    }
}