我正在进行一项任务。我制作了两个数组,一个保存每个唯一的单词,另一个计算每个唯一单词的使用次数。 现在我需要找到最高值的数组,意思是最常用的单词,然后打印属于该类别的每个单词:前十个用过的单词。我做了一次尝试,但是在找到最高价值部分时失败了。 (如果有人能给我一个关于如何让程序读取文本并保存没有逗号,斜线等字样的提示,请做)
我不允许使用HashMaps,对不起。忘了提。
代码:
import java.util.*;
import java.io.*;
class Oblig3B{
public static void main(String[]args){
OrdAnalyse oa = new OrdAnalyse();
String filArgs=args[0];
oa.analyseMetode(filArgs);
}
}
class OrdAnalyse{
void analyseMetode(String filArgs){
//Begynner med aa opprette alle variabler som trengs, disse deklareres rett under. De ligger her oppe bare for at jeg skal ha oversikten over de.
Scanner input, innfil;
String[] ord;
int[] antall;
int antUnikeOrd, antOrd;
PrintWriter utfil;
boolean sjekk;
//Deklarerer alle bortsett fra de som har med fil aa gjore, disse deklareres inne i en try-catch-loop (printwriter utfil og scanner innfil).
input=new Scanner(System.in);
ord=new String[5000];
antall=new int[5000];
antUnikeOrd=0;
antOrd=0;
sjekk=true;
try{
innfil=new Scanner(new File(filArgs));
//Naa sjekker programmet om ordet som blir lest med Scanner-metoden er lest for. Er det slik, saa oeker den antallet i samme index i antall-arrayen med 1, den boolske verdien sjekk blir true, og neste if-lokke vil ikke kjore, for loopen er ferdig og neste ord leses.
//Here it reads the file, word by word.
while(innfil.hasNext()){
String ordLest=innfil.next().toLowerCase();
sjekk=false;
for(int i=0; i<ord.length; i++){
if(ordLest.equals(ord[i])){
antall[i]+=1;
sjekk=true;
}
}
if(!sjekk){
//Her vil lokken oke telleren antUnikeOrd med en for hvert unike ord som leses, og denne er alltid en
ord[antUnikeOrd]=ordLest;
antall[antUnikeOrd]++;
antUnikeOrd++;
}
antOrd++;
}
innfil.close();
}catch(Exception e){
e.printStackTrace();
}
try{
utfil=new PrintWriter(new File("Oppsummering.txt"));
utfil.println("Antall ord lest: " +antOrd+ " og antall unike ord: "+antUnikeOrd+" "+ ord.length);
finnOrd(antall, ord, utfil);
for(int i=0; i<ord.length; i++){
utfil.println(ord[i]+(" ")+antall[i]);
}
utfil.close();
}catch(Exception e){
e.printStackTrace();
}
}
//This is the method where I will find the top ten percent most used words.
void finnOrd(int[] antall, String[] ord, PrintWriter utfil){
int teller=1000;
for(int i=0; i<ord.length; i++){
if(antall[i]>teller){
teller=antall[i];
}
//Naa er teller lik den hoyeste verdien i antall-arrayen.
double tiprosent=teller*0.90;
System.out.println(tiprosent + " " + teller);
for(i=0; i<ord.length; i++){
if(antall[i]>tiprosent){
utfil.println("Vanlige ord: "+ord[i]+"\t("+antall[i]+" forekomster)");
}
}
}
}
}
答案 0 :(得分:0)
正如@Gustavo在评论中所说,将它们放在MyHash<string, int>,
之类的哈希值中,然后按MyHash
Value
答案 1 :(得分:0)
antall [antUnikeOrd] ++; antUnikeOrd ++;
你能告诉我那些人在做什么吗?还有什么antall [i] + = 1; 它正在做什么?听起来你可能会重复这项工作,但我在理解某些语言方面遇到了一些麻烦,所以很难肯定。
然而,如果重复它,它实际上并不重要,因为它会使所有内容倍增!
我在你的finnOrd方法中看到你,你以int teller = 1000开始;
出纳员是否是任意的,或者您是否知道某些确实会有10000个单词?我知道你的数组是那个长度,但你不确定是否每个元素都被填充(除非特别说明这部分内容)。如果您不确定,您已经有了更好的指标来确定10%是什么 - antUnikeOrd正在计算独特的单词,因此10%的独特单词数量会正确地给你你需要什么。
现在有几种方法可以实际找到这些词 - 你可以使用Hash,就像我们所建议的那样,但我的想法可能是你不允许的。
您只想浏览一次结果列表,这样您就可以创建一个数组[10]来存储评分最高的十个单词。
您还可以利用这段时间来了解排序,并研究排序数组所需的内容 - 此时您只需要完成前十项内容。
你可以采用非常低效的方式并通过阵列十次,每次拔出顶部单词并将其设置为零。这不是一个真正的选择,但我把它扔出去,所以你可以开始考虑不同的方法来解决这个问题。