打印文本中排名前10%的单词

时间:2013-10-17 22:08:06

标签: java arrays printing count

我正在进行一项任务。我制作了两个数组,一个保存每个唯一的单词,另一个计算每个唯一单词的使用次数。 现在我需要找到最高值的数组,意思是最常用的单词,然后打印属于该类别的每个单词:前十个用过的单词。我做了一次尝试,但是在找到最高价值部分时失败了。 (如果有人能给我一个关于如何让程序读取文本并保存没有逗号,斜线等字样的提示,请做)

  

我不允许使用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)");
        }
        }
    }
    }
}

2 个答案:

答案 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]来存储评分最高的十个单词。

您还可以利用这段时间来了解排序,并研究排序数组所需的内容 - 此时您只需要完成前十项内容。

你可以采用非常低效的方式并通过阵列十次,每次拔出顶部单词并将其设置为零。这不是一个真正的选择,但我把它扔出去,所以你可以开始考虑不同的方法来解决这个问题。