0

私は、文字のストリームを取り、単語を形成し、単語の配列を作成し、それぞれの一意の単語とその発生回数を含むベクトルを作成するものに取り組んできました (基本的には単語カウンター)。

とにかく、私は長い間 Java を使用しておらず、正直に言うと多くのプログラミングを行っていないので、現在の外観に満足していません。ベクトルが醜く見える部分があり、乱雑にならないようにすることができるかどうか知りたかったのです。

    int counter = 1;
    Vector<Pair<String, Integer>> finalList = new Vector<Pair<String, Integer>>();
    Pair<String, Integer> wordAndCount = new Pair<String, Integer>(wordList.get(1), counter); // wordList contains " " as first word, starting at wordList.get(1) skips it.

    for(int i= 1; i<wordList.size();i++){
        if(wordAndCount.getLeft().equals(wordList.get(i))){
            wordAndCount = new Pair<String, Integer>(wordList.get(i), counter++);
        }
        else if(!wordAndCount.getLeft().equals(wordList.get(i))){
            finalList.add(wordAndCount);
            wordAndCount = new Pair<String, Integer>(wordList.get(i), counter=1);
        }
    }
    finalList.add(wordAndCount); //UGLY!!

二次的な質問として、これにより、すべての単語がアルファベット順に並べられたベクトルが得られます (配列のように)。その中でアルファベット順に並べ替えたいと思います。

最良の選択肢は次のとおりです。

  • ベクトルを下方向に反復し、各出現 int を上記のものでテストし、Collections.swap()それがより高いかどうかを使用して、上の次のものをチェックし (1 つ上に移動したため)、その上にあるものよりも大きくなくなるまで繰り返します。1 の発生はスキップできます。

  • ベクトルを再度下方向に反復し、ベクトルの最初の要素に対して各要素をテストし、出現回数が少なくなるまで下方向に反復し、その要素の上に挿入します。1 の出現はすべてスキップされます。

最初の方法は、要素を反復処理するという点でより多くのことを行いますが、2 番目の方法では、ベクトルのコンポーネントを追加および削除する必要があるため (私が思うに?)、どちらがより効率的であるか、検討する価値があるかどうかはわかりません。

4

3 に答える 3

5

Map問題を解決するためにa を使用してみませんか?

String[] words // your incoming array of words.
Map<String, Integer> wordMap = new HashMap<String, Integer>();
for(String word : words) {
  if(!wordMap.containsKey(word))
    wordMap.put(word, 1);
  else
    wordMap.put(word, wordMap.get(word) + 1);
}    

並べ替えは、Java の並べ替えられたコレクションを使用して行うことができます。

SortedMap<Integer, SortedSet<String>> sortedMap = new TreeMap<Integer, SortedSet<String>>();
for(Entry<String, Integer> entry : wordMap.entrySet()) {
  if(!sortedMap.containsKey(entry.getValue()))
    sortedMap.put(entry.getValue(), new TreeSet<String>());

  sortedMap.get(entry.getValue()).add(entry.getKey());
}

最近では、ソートは言語のライブラリに任せるべきです。それらは何年にもわたって正しいことが証明されています。

すべてのデータ構造が関与するため、コードは大量のメモリを使用する可能性があることに注意してください。ただし、それはより高いレベルのプログラミングに支払うものです (メモリは毎秒安くなります)。

コードを実行して動作することを確認しませんでしたが、コンパイルされます(Eclipseから直接コピーしました)

于 2012-07-16T14:40:42.277 に答える
0

re: 並べ替え、1 つのオプションは、Comparator最初に各単語が出現する回数を調べ、次に (等しい場合) 単語をアルファベット順に比較するカスタムを作成することです。

private final class PairComparator implements Comparator<Pair<String, Integer>> {
    public int compareTo(<Pair<String, Integer>> p1, <Pair<String, Integer>> p2) {
        /* compare by Integer */
        /* compare by String, if necessary */
        /* return a negative number, a positive number, or 0 as appropriate */
    }
}

finalList次に、呼び出して並べ替えますCollections.sort(finalList, new PairComparator());

于 2012-07-16T14:46:43.323 に答える
0

google guava ライブラリを使ってみてはどうですか?

   Multiset<String> multiset = HashMultiset.create();
   for (String word : words) {
       multiset.add(word);
   }

   int countFoo = multiset.count("foo");

彼らのjavadocから:

Set のように、順序に依存しない等価性をサポートするコレクションですが、要素が重複している可能性があります。マルチセットはバッグと呼ばれることもあります。

簡単ですか?

于 2012-07-16T15:53:19.707 に答える