使用字典计算数据的频率

时间:2014-03-25 10:59:12

标签: java

我有一个带有class属性的数据,但我不知道该类的所有值。 我想计算班级频率 例如 数据

 | data | class|  
 |  1   |  X   |
 |  2   |  Y   |
 |  3   |  Y   |

结果:

 class X occurs 1 times
 class Y occurs 2 times

如果我发现新类型的类我需要将它保存在字典中,但如果我发现一个已经在字典中的类,我应该增加计数。 那么如何使用java来处理它?<​​/ p>

2 个答案:

答案 0 :(得分:1)

您可以使用HashMap来存储每个班级找到的时间:

final String data = "data 1 class X\ndata 2 class Y\ndata 3 class X";
final Scanner sc = new Scanner(data);
final HashMap<String, Integer> classes = new HashMap<String, Integer>();
while (sc.hasNextLine()) {
    final String line = sc.nextLine();
    final String clazz = line.substring(line.indexOf("class")+6);

    if (!classes.containsKey(clazz))
        classes.put(clazz, 0);
    classes.put(clazz, classes.get(clazz)+1);
}

for (Entry<String, Integer> entry : classes.entrySet())
    System.out.println("Class "+entry.getKey()+" found "+entry.getValue()+" time(s).");

输出:

Class Y found 1 time(s).
Class X found 2 time(s).

答案 1 :(得分:0)

看起来你在分类。这是一个版本(类似于Florent Bayle,但是一个完整的工作示例,只提供您的文件名):

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

public class Classify {
    public static void main(String[] args) throws Exception{
        BufferedReader reader=new BufferedReader(new FileReader("YOUR_FILENAME"));
        String line;
        Map<String,AtomicInteger> classByCount=new HashMap<>();
        while ((line = reader.readLine()) != null) {
            final String[] lineArray = line.split("\\s");
            String clazz=lineArray[lineArray.length-1];
            AtomicInteger count=classByCount.get(clazz);
            if(count==null)classByCount.put(clazz,(count=new AtomicInteger(0)));
            count.incrementAndGet();
        }
        for(Map.Entry<String,AtomicInteger> entry:classByCount.entrySet())
            System.out.printf("class '%s':%d\n",entry.getKey(),entry.getValue().get());
    }
}