すべてのコメントがポイントですが、私はそれらをコードに翻訳しようとします。各ステップで、変更されていないすべての行をコメントアウトして、変更がより明確になるようにしました。
最初に、その2次元配列をねじます。制限的で扱いにくいです。のではなく、地図を使用してみましょう:
public static Map<String, Integer> sortWords(BufferedReader in) throws IOException{
// String line = "";
Map<String, Integer> wordsCount = new HashMap<>();
//
// while((line=in.readLine())!=null) {
// String a[]=line.split(" ");
// for(int i = 0; i < a.length; i++) {
// a[i] = a[i].toUpperCase();
Integer count = wordsCount.get(a[i]); // Get current count for this word
if (count == null) count = 0; // Initialize on first appearance
count++; // Update counter
wordsCount.put(a[i], count); // Save the updated value
// }
// line=in.readLine();
// }
// return words;
//}
ちょうどその単語に関連する値を取得し、それを更新...配列は、追加のループ、無String
int
への変換を初期化する必要はありませんが。そして、今では単語の数を事前に知る必要はないので、2番目のint n
パラメータは安全に削除できます!
ここでは、2000年以前の非常に基本的な、Cのような2000年のイディオム(すべてfor(;;)
と配列など)を使用していることがわかりました。それは完全に有効ですが、あなたはより現代的でより有用な構成を見逃しています。ですので、私たちは2004年から利用可能ですか?enhanced for loop
//public static Map<String, Integer> sortWords(BufferedReader in) throws IOException{
// String line = "";
// Map<String, Integer> wordsCount = new HashMap<>();
//
// while((line=in.readLine())!=null) {
// String a[]=line.split(" ");
for(String word : a) {
word = word.toUpperCase();
Integer count = wordsCount.get(word); // Get current count for this word
// if (count == null) count = 0; // Initialize on first appearance
// count++; // Update counter
wordsCount.put(word, count); // Save the updated value
// }
// line=in.readLine();
// }
// return wordsCount;
//}
鮮明構文は、我々はループの中で扱っているオブジェクトの種類を正確に知っている...と、すべての最高は、それはそれはきれいにするためにあなたにインラインあなたのコードの一部をすることができます。今toUpperCase()
方法ではなく、単語ごとに一度の行ごとに一度だけ呼び出されます、そして我々は
最後;-P左皆の目を傷つけたことString a[]
を処分した
//public static Map<String, Integer> sortWords(BufferedReader in) throws IOException{
// String line = "";
// Map<String, Integer> wordsCount = new HashMap<>();
//
// while((line=in.readLine())!=null) {
for(String word : line.toUpperCase().split(" ")) {
// Integer count = wordsCount.get(word); // Get current count for this word
// if (count == null) count = 0; // Initialize on first appearance
// count++; // Update counter
// wordsCount.put(word, count); // Save the updated value
// }
// line=in.readLine();
// }
// return wordsCount;
//}
を:このように最後にその余分なreadLine()
を取り除くことです。それでは、あなたのコードは次のようになります:
public static Map<String, Integer> sortWords(BufferedReader in) throws IOException {
String line = "";
Map<String, Integer> wordsCount = new HashMap<>();
while ((line = in.readLine()) != null) {
for(String word : line.toUpperCase().split(" ")) {
Integer count = wordsCount.get(word); // Get current count for this word
if (count == null) count = 0; // Initialize on first appearance
count++; // Update counter
wordsCount.put(word, count); // Save the updated value
}
}
return wordsCount;
}
非常によかった!
次のようなメソッドを使用することができます。
BufferedReader in = new BufferedReader(new FileReader("myWords.txt"));
Map words = sortWords(in);
int numberOfHellos = words.get("Hello");
int numberOfGreetings = numberOfHellos + words.get("Hi") + words.get("Howdy");
あなたはこのコード `}}}ライン= in.readLine()で行をスキップします
;' –
あなたは1から開始する回数を設定したように、カウンターを更新して1回の出現とカウント== 2で終了する単語の最初の出現を見つけました。0から始めるか、ループ内の初期化部分を移動する必要があります。さらに、配列の長さを行数に設定しますが、見つけることのできる単語はそれ以上に可能です。 –
単語とその出現を 'HashMap'に格納する方が簡単です。新しい単語が見つかるたびに、その単語を 'HashMap'に置き、その値を' 1'にします。すでにハッシュに入っている場合は、 '++ 'などを使って値を更新します。 –
Justplayit94