0

プログラムを正常に実行するのに問題があります。私が今一週間取り組んでいて、それを手に入れることができないこの部分を除いて、それはほぼ完了しています. プログラムは、各単語の出現回数をカウントする必要があります。

の入力で:

This is my file, yes my file My file.. ? ! , : ; / \ |" ^ * + = _( ) { } [ ] < >

出力は次のようになります。

    file *3
    is *1
    my *3
    this *1
    yes *1

ここに私のコードがあります

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collections;

public class cleanup3 {

public cleanup3() {}

public static void main(String[] args) {   
  try{
     ArrayList myArraylist = new ArrayList();
     System.out.println("Please Enter file");

     InputStreamReader istream = new InputStreamReader(System.in) ;

     BufferedReader bufRead = new BufferedReader(istream) ;
     String fileName = bufRead.readLine();

     BufferedReader file = new BufferedReader(new FileReader(fileName));

     String s = null;
     while((s = file.readLine()) != null) {                      
         String updated2 = s.replaceAll("[\\.\\,\\?\\!\\:\\;\\/\\|\\\\\\^\\*\\+\\=\\_\\(\\)\\{\\}\\[\\]\\<\\>\"]+"," ");  

         //note to self: missing Single quotes (only if the LAST character of a token)
         StringTokenizer st = new StringTokenizer(updated2.toLowerCase());
         while (st.hasMoreTokens()) {
              String nextToken = st.nextToken();

              String myKeyValue = (String)myMap.get(nextToken);
              if(myKeyValue == null){
                  myMap.put(nextToken, "1");
              }
              else{
                  int mycount = Integer.parseInt(myKeyValue) + 1;
                  myMap.put(nextToken, String.valueOf(mycount));
              }
              System.out.println(nextToken);                           
           }   
        }
            System.out.println( updated2.toLowerCase());
            myArraylist.add(updated2.toLowerCase());                     
    }           
    Collections.sort(myArraylist);
    String outPutFileName =  fileName + "sorted.txt";         
    PrintStream ps = new PrintStream( outPutFileName );
    ps.print(myArraylist.toString());
    ps.flush();
    ps.close();        
  }
  catch (Exception e){
      System.out.println(e.toString());
  }
 }
4

2 に答える 2

3

あなたのコードは複雑すぎます - 数行のコードしか必要ありません。

これを行うエレガントな方法は次のとおりです。

Map<String, Integer> map = new TreeMap<String, Integer>();
for (String word : input.toLowerCase().replaceAll("[^a-z ]", "").trim().split(" +"))
    map.put(word, map.containsKey(word) ? map.get(word) + 1 : 1);
for (Map.Entry<String, Integer> entry : map.entrySet())
    System.out.println(entry.getKey() + " *" + entry.getValue());

入力:

  • 小文字に変換され、大文字と小文字の問題が処理されます
  • すべての非文字/スペースが削除され、入力のクリーニングが処理されます
  • トリムされ、入力を分割する準備が整います
  • 1-n スペースで分割されます
  • 合計を累積するマップに追加され、単語の合計の初期化を処理するために三項を使用します

次に、マップ エントリが繰り返されて合計が出力されます。

aTreeMapを使用すると、無料でアルファベット順に並べ替えることができます。

于 2013-06-06T01:14:22.650 に答える