私は、文字のストリームを取り、単語を形成し、単語の配列を作成し、それぞれの一意の単語とその発生回数を含むベクトルを作成するものに取り組んできました (基本的には単語カウンター)。
とにかく、私は長い間 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 番目の方法では、ベクトルのコンポーネントを追加および削除する必要があるため (私が思うに?)、どちらがより効率的であるか、検討する価値があるかどうかはわかりません。