0

我有一个我正在处理的任务。我制作了两个数组,一个保存每个唯一单词,一个计算每个唯一单词的使用次数。现在我需要找到最高值的数组,即最常用的词,然后打印属于该类别的每个词:从那里开始使用前十个词。我做了一次尝试,但在找到最高价值部分时失败了。(如果有人可以给我一个关于如何让程序读取文本并保存不带逗号、斜杠等的单词的提示,请执行)

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

2 回答 2

0

正如@Gustavo 在他的评论中所说,把它们放在一个哈希中,就像MyHash<string, int>,then order MyHashbyValue

于 2013-10-17T22:16:22.400 回答
0

antall[antUnikeOrd]++; antUnikeOrd++;

你能向我解释一下他们在做什么吗?还有什么 antall[i]+=1; 上面它是干什么的?在我看来,您可能正在复制这项工作,但我在理解某些语言时遇到了一些麻烦,所以很难确定。

但是,如果这是复制它,它实际上并不重要,因为它使所有东西都翻倍!

我在您的 finnOrd 方法中看到您,您从 int Teller=1000; 开始

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

现在有几种方法可以实际找到单词 - 你可以使用哈希,就像建议的那样,但我的想法是你可能不被允许。

您只想浏览一次结果列表,因此您可以创建一个数组 [10] 来存储评分最高的最后十个单词。

您还可以花时间学习排序,并研究对数组进行排序需要什么——此时您只需提取前十件事。

您可以采用非常低效的方式并遍历数组十次,每次都取出最上面的单词并将其计数设置为零。这不是一个真正的选择,但我把它扔在那里,所以你可以开始思考你可以尝试解决这个问题的不同方法。

于 2013-10-17T22:27:40.720 回答