【问题标题】:Java statistics by words in long string按长字符串中的单词进行 Java 统计
【发布时间】:2013-04-14 23:29:20
【问题描述】:

我正在用 java 编写一个程序来获取一个非常大的字符串(字符串 s

import java.util.Scanner;
class Main{
 public static void main(String[] args){


  Scanner sc = new Scanner(System.in);
  String t = sc.nextLine();
  int i=0;
  while(t.charAt(i)==' ') i++;
  t = t.substring(i);
  String[] s = t.split(" +");

  RecString[] stat  = new RecString[s.length];
  for(i=0; i<s.length;i++){
    stat[i] = new RecString("");  
  }
  int j=0;
  for(i=0; i<s.length;i++){
    int f=0;
    for(int h =0; h<stat.length; h++){
     if(stat[h].word.equals(s[i])){
       f = 1;
       stat[h].count++;
       break;
     }
    }
    if(f==0){
      stat[j] = new RecString(s[i]);
      j++;
    }
  }
  for(i=0;i<=j;i++){
   if(stat[i].word != ""){
      System.out.println(stat[i].word+" "+(stat[i].count));
   }
  }


 }
}

class RecString{
    public  String word;
    public  int count;

    public RecString(String s){
        word = s;
        count = 1;
    }

}

此代码适用于长度

请帮我优化我的程序

【问题讨论】:

  • 你在计算每个单词的出现次数吗?!还是……?
  • 用于这样一个微不足道的应用程序的内存量可能很大程度上取决于您的堆大小和 JVM 设置。换行读取也总是要求潜在的内存问题。
  • @DaveNewton,是的,我计算每个单词的出现次数。
  • 我不是很懂代码;不知道为什么不只是单词图=>计数-应该是微不足道的。 “使用少于 16M 的内存”是什么意思?整个事情,包括 JVM?
  • @DaveNewton,是的,我计算每个单词的出现次数。我在使用 .split 后按字符串获取数组,并按记录(单词和计数)创建新数组。对于这条记录的所有元素,我设置 word = "" 和 count = 0。然后我通过数组 s 的元素,如果这个元素在 stat 中我增加这个单词的计数,否则我在 stat 中添加新单词跨度>

标签: java string optimization words


【解决方案1】:

如果您关心内存,您将希望尽可能多地进行流式传输。

http://docs.oracle.com/javase/6/docs/api/java/io/StreamTokenizer.html

StreamTokenizer tokenizer = new StreamTokenizer(new InputStreamReader(System.in));

while(tokenizer.nextToken() != StreamTokenizer.TT_EOF){

    if(tokenizer.ttype == StreamTokenizer.TT_WORD) {
        // found a word.
        System.out.println(tokenizer.sval);
    }
}

当然,如果内存不是问题并且速度是您唯一关心的问题,Hadoop 有一个出色的字数统计示例:http://wiki.apache.org/hadoop/WordCount。但请留着以备不时之需。

另外,您计算单词的逻辑不适合效率(其O(N))。 @DaveNewton 是对的,您可能应该使用Map&lt;String,Integer&gt;,它将为您提供O(1),而不是您的RecString 数组。我不会纠正你对此的看法,因为我认为这是一个很好的练习。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2011-06-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    相关资源
    最近更新 更多