Java统计数据(按长字符串中的单词)
我正在用java编写一个程序,以获取一个非常大的字符串(字符串s中的单词)的统计信息,如果您关心内存,您将希望尝试尽可能多地流式处理 看 当然,如果内存不是问题,速度是您唯一关心的问题,那么Hadoop有一个很好的字数计算示例:。但请将其保存起来,以备不时之需Java统计数据(按长字符串中的单词),java,string,optimization,words,Java,String,Optimization,Words,我正在用java编写一个程序,以获取一个非常大的字符串(字符串s中的单词)的统计信息,如果您关心内存,您将希望尝试尽可能多地流式处理 看 当然,如果内存不是问题,速度是您唯一关心的问题,那么Hadoop有一个很好的字数计算示例:。但请将其保存起来,以备不时之需 此外,您计算单词的逻辑不符合效率要求(其O(N))。@DaveNewton认为您可能应该使用Map,这将为您提供O(1)而不是你的RecString数组。我不打算纠正你的conde,因为我认为这是一个很好的练习。你是在计算每个单词的出现次
此外,您计算单词的逻辑不符合效率要求(其
O(N)
)。@DaveNewton认为您可能应该使用Map
,这将为您提供O(1)
而不是你的RecString数组。
我不打算纠正你的conde,因为我认为这是一个很好的练习。你是在计算每个单词的出现次数吗?!还是…?这样一个微不足道的应用程序使用的内存量可能很大程度上取决于你的堆大小和JVM设置。newli也在阅读ne总是询问潜在的内存问题。@DaveNewton,是的,我在计算每个单词出现的次数。我不太理解代码;不确定为什么不只是单词的映射=>counts——应该是微不足道的。你说的“使用少于16M的内存”是什么意思整个事情,包括JVM?@DaveNewton,是的,我计算每个单词的出现次数。使用后我按字符串获取数组。按记录(单词和计数)拆分并创建新数组。对于此记录的所有元素,我设置word=“”并且count=0。然后我通过数组s的元素,如果stat中有这个元素,我增加这个单词的计数,否则我在stat中添加新单词
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;
}
}
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);
}
}