0

私には取り組んでいる課題があります。私は 2 つの配列を作成しました。1 つはすべての一意の単語を保存し、もう 1 つはすべての一意の単語が使用された回数をカウントします。次に、最も値の高い配列、つまり最も使用されている単語を見つけて、カテゴリに分類されるすべての単語を出力する必要があります。上位 10 の使用単語です。1 回試みましたが、最高値の部分を見つけることができませんでした。(そして、誰かがプログラムにテキストを読み取らせ、コンマやスラッシュなどを使わずに単語を保存させる方法についてのヒントを教えてもらえれば、そうしてください)

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

antal[antUnikeOrd]++; antUnikeOrd++;

彼らが何をしているのか説明してもらえますか?また、何 antal[i]+=1; それはやっている?あなたが作品を複製しているように思えますが、私はいくつかの言語を理解するのに少し苦労しているので、確実に言うのは難しいです.

ただし、それが複製されている場合、実際には重要ではありません。

私はあなたのfinnOrdメソッドであなたを見ます.あなたは int teller=1000; から始めています.

出納係は恣意的ですか、それとも正確に 10000 個の単語があることを確実に知っていますか? あなたの配列がその長さであることは知っていますが、すべての要素が満たされるかどうかはわかりません(それが具体的な指示の一部でない限り)。確かにわからない場合は、10% が何であるかを把握するためのはるかに優れたメトリックがあります。 .

現在、実際に単語を見つける方法がいくつかあります。提案されているように、ハッシュを使用できますが、私の考えでは、許可されていない可能性があります。

結果リストを 1 回だけ確認したい場合は、最も評価の高い最後の 10 語を格納する配列 [10] を作成できます。

この時間を使って並べ替えについて学び、配列の並べ替えに必要なものを調べることもできます。その時点で、最初の 10 個のものを引き出すだけです。

本当に非効率な方法で、配列を 10 回調べて、毎回一番上の単語を取り出し、そのカウントをゼロに設定することもできます。これは実際の選択肢としては良くありませんが、これを解決するためのさまざまな方法について考え始めることができるように、私はそれを投げ出しました.

于 2013-10-17T22:27:40.720 に答える
0

@Gustavoが彼のコメントで言ったように、それらをMyHash<string, int>,次のようにハッシュに入れてMyHashValue

于 2013-10-17T22:16:22.400 に答える