读取文本文件并存储每个单个字符

时间:2014-10-23 20:52:59

标签: java arrays char

我想创建一个java程序来读取文本文件并存储每个单个字符。因此它将考虑标点符号,字母,数字,大写,小写等。 给定一个文本文件:

  

玫瑰红了,

     

紫罗兰是蓝色的。

打印值将如下所示:

  

R:1

     

r:3

     

我:1

     

,:1

     

[ect]

到目前为止,我能够读取文件并计算单词,行,字符。

package Exercise3;
import java.util.Scanner;
import java.util.StringTokenizer;
import java.io.*;
    public class StringTokenizerDemo1
    {
        public static void main(String[] args) throws IOException
        {
            Scanner keyboard = new Scanner(System.in);
            File file = new File("C://Users//guy//Desktop//Practice.txt");
            Scanner inputFile = new Scanner(file);
            String line, word;
            StringTokenizer token;
            int words = 0; //word count 
            int lines = 0; //line count
            int chars = 0; //char count 
            while (inputFile.hasNext())
            {
                lines++; //add one to line count 
                line = inputFile.nextLine();
                token = new StringTokenizer(line, " ");
                while (token.hasMoreTokens())
                {
                    words++; //add one word count 
                    word = token.nextToken();
                    chars+= word.length(); //add to char count 
                }
            }
        }
    }

我还没有学习哈希映射/表格或树图;寻找关于如何使用数组,arraylist或linkedlist存储所有char类型及其出现的一些建议。

3 个答案:

答案 0 :(得分:3)

char是16位无符号值,如果将其强制转换为int,那么您将获得0到65535之间的值。这意味着您可以使用数组来存储你的角色:

int[] charCounts = new int[65536];

然后当您想要记录char c

的出现时间
charCounts[(int) c]++;

当您想要读取计数时:

for (int i=0; i<65536; i++)
    if (charCounts[i]>0)
        System.out.println((char)(i)+": "+charCounts[i]);

如果你想把它作为一个练习,没有什么可以阻止你使用HashMap<Character,Integer>来做这件事,虽然它比它需要的重量级更重:

HashMap<Character,Integer> map = new HashMap<Character,Integer>();

当您想要记录char c的出现时间:

if (!map.containsKey(c))
    map.put(c,1);
else
    map.put(c,map.get(c)+1);

当你想要阅读时:

for (Map.Entry<Character,Integer> entry: map.entrySet())    
    System.out.println(entry.getKey()+": "+entry.getValue());

请注意,对于所有这些,我假设您只处理可打印字符。如果没有,那么当你打印出来时,你会想要做些什么。

答案 1 :(得分:1)

这将计算数组中每个字符的出现次数     公共课爵士乐

    public static void main(String[] args) {
        String [] arr = {"a", "b", "a","c", "d"}; 
        HashMap<String, Integer> map = new HashMap<String,Integer>(); 
         for (String i : arr) {
                if (map.get(i) == null) {
                    map.put(i, 1);
                } else {
                    map.put(i, map.get(i) + 1);
                }
         }

答案 2 :(得分:0)

如果您只想存储有限的nr个字符,其中某些字符是合法的而其他字符是忽略的,您可以创建一个固定大小的数组,其中char的int值表示其索引,然后增加该索引中的出现值(正如chiastic-security的回答所示。)

使用ArrayList / LinkedList最简单的方法可能是创建一个表示char及其出现的类,然后将该对象添加到列表中。

<read char>
<search list for char>
<if list contains char>
   <increment char's occurence>
<else>
   <create a new char/occurence-object and add it to the list>