Java 打印文本中使用率最高的10%的单词

Java 打印文本中使用率最高的10%的单词,java,arrays,printing,count,Java,Arrays,Printing,Count,我有一项作业正在做。我制作了两个数组,一个保存每个唯一的单词,另一个计算每个唯一的单词被使用的次数。 现在,我需要找到值最高的数组,即使用最多的单词,然后打印属于该类别的每个单词:前十个使用过的单词。我做了一次尝试,但在找到最高值的部分时失败了。(如果有人能告诉我如何让程序读取文本并保存不带逗号、斜杠等的单词,请告诉我) 我不允许使用HashMaps,很抱歉。忘了提了 守则: import java.util.*; import java.io.*; class Oblig3B{ pu

我有一项作业正在做。我制作了两个数组,一个保存每个唯一的单词,另一个计算每个唯一的单词被使用的次数。 现在,我需要找到值最高的数组,即使用最多的单词,然后打印属于该类别的每个单词:前十个使用过的单词。我做了一次尝试,但在找到最高值的部分时失败了。(如果有人能告诉我如何让程序读取文本并保存不带逗号、斜杠等的单词,请告诉我)

我不允许使用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)");
        }
        }
    }
    }
}
import java.util.*;
导入java.io.*;
类别G3B{
公共静态void main(字符串[]args){
OrdAnalysis oa=新的OrdAnalysis();
字符串filArgs=args[0];
oa.分析电极(filArgs);
}
}
课堂秩序分析{
void分析方法(字符串filArgs){
//Begynner med A opprette Aller variabler som trengs,deklareres rett下。De ligger她在jeg skal的裸体超过了De。
扫描仪输入,innfil;
字符串[]ord;
int[]安塔尔;
安图尼科德国际酒店;
印刷作家乌特菲尔;
布尔sjekk;
//德克拉雷尔·阿勒·博采特(alle bortsett fra de som har med fil aa gjore)是一位作家,他在一个尝试捕捉环(printwriter utfil og scanner innfil)中创作了这部作品。
输入=新扫描仪(System.in);
ord=新字符串[5000];
antall=新整数[5000];
antUnikeOrd=0;
安托德=0;
sjekk=真;
试一试{
innfil=新扫描仪(新文件(filArgs));
//Naa sjekker计划使用了om ordet som blir-med扫描仪,用于.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,用于Lopen ferdig Nest ord Lees。
//在这里,它逐字读取文件。
while(innfil.hasNext()){
字符串ORDEST=innfil.next().toLowerCase();
sjekk=假;

对于(inti=0;i,正如@Gustavo在他的评论中所说的,将它们放入一个类似于
MyHash的散列中,
然后按
Value
antall[antUnikeOrd]++; antUnikeOrd++

你能给我解释一下它们在做什么吗?还有什么是antall[i]+=1; 在我看来,你可能是在重复工作,但我在理解一些语言方面有点困难,所以很难确定

然而,如果这是复制它,它实际上并不重要,因为它是平等地加倍一切

我在finnOrd方法中看到了你,你从int-teller=1000开始

teller是任意的,还是您确定会有10000个单词?我知道您的数组就是这个长度,但您不确定是否每个元素都会被填充(除非这是说明的一部分).如果你不确定,你有一个更好的指标来计算10%是什么-antUnikeOrd正在计算唯一的单词数,因此10%的唯一单词数将正确地为你提供你所需要的

现在有两种方法可以找到单词-你可以使用散列,就像有人建议的那样,但我的想法是也许你不允许这样做

您只需要浏览一次结果列表,这样您就可以创建一个数组[10],用于存储评分最高的最后十个单词

您还可以利用这段时间来学习排序,并研究排序数组所需的时间——此时您只需提取前十项内容


你可以采用非常低效的方法,对数组进行十次遍历,每次都将最上面的单词取出,并将其计数设置为零。这一个选项不适合作为实际选项,但我将它扔到了那里,这样你就可以开始思考解决这个问题的不同方法。

为什么不使用LinkedHashMap,然后使用c对其进行排序ustom comparator?忘记添加:不允许使用HashMaps antall[i]+=1向antall数组中添加一个,该数组存储文件中注册的每个唯一字的数量。如果该字当前不存在于数组中,则其他两个将在索引处的数组中注册一个字,其中当前最大计数的唯一字的值为,antall[antUnikeOrd]++在同一索引处向antall数组添加一个值,开始计算该单词的每次出现次数。不,只是将出纳员设置为某个值。我尝试将其用作值,以启动下面的for循环。