现在有一组用逗号(,)隔开的字符串
String str = "中国,美国,日本,朝鲜,中国,中国,美国,越南";实现一下效果:
中国 的个数 3
美国 的个数 2
朝鲜 的个数 1
....主要是现在这个字符串可能会包含上万个单词,想求最有效,最快的办法。

解决方案 »

  1.   

    建议做法,用StringTokenizer处理,把字符串一个一个全部存入数据库,然后一个group by全部出来。
    这是一种比较简单的做法,也可以使用一个Map保存个数,如  Map map = new HashMap<String,Integer>();然后用StringTokenizer处理后将map对应的Integer每次修改一下,如果觉得用Integer不好处理,可以自己封装一个和Integer差不多的类,但是比Integer好的就是可以自动加,而不用重新构建。
      

  2.   

    死方法应该容易写
    算法
    从第一个开始
    第1个和所有比较如果相同取出
    然后递归有效率的话LZ看看这编--中文排序
    http://www.blogjava.net/jeff-lau/archive/2007/12/21/169257.html
      

  3.   

    普通做法有时间再优化下LZ
    package csdn2;import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;public class TestCS {
    public static void main(String[] args) {
    String a =  "中国,美国,日本,朝鲜,中国,中国,美国,越南"; 
    List list = getList(a);
    for(int i  = 0;i<list.size();i++){
    System.out.println(list.get(i).toString());
    }
    Map amap = testSplit(list);
    System.out.println(amap.get("中国"));
    }
    static Map map = new HashMap();
    public static Map testSplit(List  list){
    int mapinI = 1;
    String firString=null;
    if(list.size()>=1){
    firString =list.get(0).toString();
    map.put(firString, mapinI);

    list.remove(0);
    }
    int i= 0;
    for( ;i<list.size();i++) {
    String falgString = list.get(i).toString();
    if(falgString.equals(firString)){
    // 加了后去掉
    mapinI=mapinI+1;
    map.put(firString, mapinI);
    list.remove(i);
    i=-1;
    }
    }
    if(list.size()>=1){

    // 递归
    testSplit(list);
    }
             return map;
    }

    public static List getList(String p){
    String[] s = p.split(",");
    List childList = new ArrayList();
    for(int i = 0;i<s.length;i++){
    childList.add(s[i]);
    }
    return childList;
    }
    }
      

  4.   


    import java.util.Map;
    import java.util.TreeMap;//统计单词出现的次数
    public class Frequency {
    public static void main(String[] args) {
    Map<String, Integer> m = new TreeMap<String, Integer>();// TreeMap...带排序的Map String str = "中国,美国,日本,朝鲜,中国,中国,美国,越南"; 
    String[] strArray=str.split(",");
    for (String word : strArray) {
    Integer freq = m.get(word);// 获取此单词以前出现的次数 m.put(word, (freq == null ? 1 : freq + 1));
    } System.out.println(m);
    }
    }
      

  5.   


    private static void test(String arg,String regex){
    HashMap<String,IntValue> container = new HashMap<String,IntValue>();
    String[] argArray = arg.split(regex);
    for(int i=0;i<argArray.length;i++){
    if(container.containsKey(argArray[i])){
    IntValue iv = container.get(argArray[i]);
    iv.calculate();
    }else{
    container.put(argArray[i], new IntValue());
    }
    }
    print(container);
    }
    private static void print(Map map){
    for(Iterator iter = map.entrySet().iterator();iter.hasNext();){
    Map.Entry<String,IntValue> e = (Entry<String, IntValue>) iter.next();
    System.out.println(e.getKey() + "-->" + e.getValue().getValue());
    }
    }
    static class IntValue{
    int counter = 1;
    public void calculate(){
    this.counter++;
    }
    public int getValue(){
    return this.counter;
    }
    }
      

  6.   

    对于字符串的做法,6#已经解决了。其实没必要用TreeMap,你去看看输出是不是按照顺序输出的?如果真的这个字符串很大的话,只能存在文件中,那就需要引入io了。
      

  7.   

    按照前几个写的代码, 可以解决问题,HashMap的长度也不会很长, 毕竟国家总数也不过200多一点, 查找效率会很高的
      

  8.   

    当然不是国家了,我只是随便找个例子。
    我一个论坛可能有成千上万个帖子,每个帖子就是一句话,我现在用一个分词的工具,可以把这个句子中的所有的单词(是,啊,呢...之类的无效词语除去)给分出来,一个帖子可能有10个单词,但是一万个帖子,可能就有10万个单词,加入想CSDN这样的能有多少帖子了,单词数有多少?
    当然单词肯定有重复的。就是计算单词出现的次数的多少。这些单词在数据库中也好,在文件中也好,取出来容易,关键是好的算法来计算了。
    至于个数的排序,能用程序固然不错,但是第一步总要计算个数,排序,可以利用exacle或其他。
      

  9.   

    正则表达式:
    public static void main(String[] args) {
    String str = "中国,美国,日本,朝鲜,中国,中国,美国,越南";
    String reg = "中国";
    Pattern p = Pattern.compile(reg);
    Matcher m = p.matcher(str);
    int i = 0;

    while(m.find()) {
    i++;
    }

    System.out.println(i);
    }
      

  10.   

    Map map = new HashMap();
    String[] workArray = works.split(",");
    for(int i = 0; i < workArray.length; i++) {
    if(map.containsKey(workArray[i])) {
    Integer value = (Integer) map.get(workArray[i]);
    map.put(workArray[i], new Integer(value.intValue() + 1));
    } else 
    map.put(workArray[i], new Integer(1));
    }
    for(Iterator iter = map.keySet().iterator(); iter.hasNext();) {
    String key = (String) iter.next();
    System.out.println(key + " 的个数 " + ((Integer)map.get(key)).intValue());
    }