2017-12-30 67 views
2

私はその中にいくつかの名前(姓と名)を持つ配列リストを持っています。私がしなければならないのは、それぞれの「ファーストネーム」を見て、配列リストの最初の名前の最後に文字が何回表示されているかを確認してから、現れた。特定の文字で終了する文字列プロパティを持つリスト項目の数を数えます。

public int countFirstName(char c) { 
    int i = 0; 
    for (Name n : list) { 
     if (n.getFirstName().length() - 1 == c) { 
      i++; 
     } 
    } 
    return i; 
} 

これは私のコードです。問題は、最初の名前の末尾に一致する文字があってもカウンタ(i)が1を加算しないことです。

+0

コードに、あなたのコードに従うと期待されるアルゴリズムのコミットを書き、コードがアルゴリズムを実際に実装していることを確認してください。 –

+1

あなたは最初の名前の長さを 'c'と比較します。 'c'は' char'ですが暗黙的に 'int'に変換できます。だから基本的に、あなたのロジックは台無しです。 – Turing85

+0

@ Turing85 ohhありがとう!私はそれを試して修正します:) – ImperfectLion

答えて

3

あなたが代わりにあなたがcharAtにアクセスできる最後の文字自体、必要な文字に文字列の最後の文字のインデックスを比較している:あなたが学習して設定している場合は

String firstName = n.getFirstName() 
if (firstName.charAt(firstName.length() - 1) == c) { 
    i++; 
} 
+0

ありがとう、そんなに男!私は自分でそれを理解しようと時間を費やしました! (あなたの解決策は機能しました):D – ImperfectLion

+1

**注**:_空のString._例外がスローされます。 –

1

コードでは、鉛筆や紙の使用、またはアルゴリズムを事前にあなたが考える言語で記述することに大きな価値があります。外国語を学ぶ人は、母国語で文章を作成し、それを外国語外国人に話す。もしあれば、外国語の学習者はネイティブで考えることができます。

コーディングも変わりません。あなたは英語を話していて、それを考えています。今、あなたは思考、構文、キーワードの異なるパターンを学ぶことを目指しています。あなたの場合は、この作業は非常に簡単になります:

  • あなたが最初
  • レシピ
  • ドン」のような、明確かつシンプルな言語での手順を書き留めを何をしたいのか、高レベルの自然言語でワークアウトtは一度にあまりにも多くのことをしよう

私はこのような何かを探しているあなたのプログラムをマーク家庭教師、IDされていた:

//method to count the number of list entries ending with a particular character 
public int countFirstNamesEndingWith(char lookFor) { 
    //declare a variable to hold the count 
    int cnt = 0; 

    //iterate the list 
    for (Name n : list) { 

    //get the first name 
    String fn = n.getFirstName(); 

    //get the last char of it 
    char lc = fn.charAt(fn.length() - 1); 

    //compare 
    if (lc == lookFor) { 
     cnt++; 
    } 
    } 
    return cnt; 
} 

順番に箇条書きを取る:

このコメントは、何が行われる必要があるかについての高水準の説明となります。一行のコードを書く前に、最初にそれらを書いています。私のコースでは、コメントのないコードにペナルティを課し、最初に書くことは、必要なものを取り除くための便利な方法でした(彼らは雑用ですよね、そうではありませんが...)。高水準言語を作成し、ステップを言語学習に変換します。あなたが書いたコードは、先に説明したアルゴリズムを実装していなかったことが明らかになったので、このアプローチを取ったとしたら、間違いなくあなたがしたと思います。

Don ' 1つの行であまりにも多くをやってみてください。はい、私は確かに多くのコーダーが見た目がクールだとか、トリックだと思っています。あるいは、印象的なコーディングの賢明さを披露して、良い10行のアルゴリズムを、あいまいではない言語機能を使用する1行のコードにまとめる必要があります。他の誰かがそのコードを維持するために来なければならない可能性があります。それを改善したり、それが何をするかを変えてください。その瞬間にそれはもはや涼しいものではありません。

Aominee、彼らのコメントで、実際に私たちは、この例のようなものを与える:

return (int)list.stream().filter(e -> e.charAt.length()-1)==c).count(); 

それはあなたの問題を解決の1つのラインの実装です。クールハァッ?さて、バグがあります(始めに)。しかし、それは私の議論の主な推進力ではありません。より基本的なレベルで:あなたは何をやっているのか分かりましたか?あなたはそれを見て、2秒後にそれがどのように動作するか教えていただけますか?

これは非常に高度な言語機能ですが、確かにトリックですが、理解しにくく、結果として維持するのが難しく、少し似ている間に多くのことをするため、非常に貧弱な解決策かもしれませんあなたが言語に精通していれば理にかなっています。この1行は、リスト内のすべての項目に対して呼び出される小さなサブメソッドを効果的に持つ機能であり、その名前が検索された文字で終わるかどうかを計算する機能です。リストをループする機能をバンドルします。

それは素晴らしい機能、かわいい例であり、それは確かにプロダクションのJavaでその場所を持っていますが、あなたの学習の練習で、おそらくここにはありません

同様に、私はあなたのこの行:

「あまりにも多くのことをやっている」と近づいています。あなたのロジックが壊れているからです。アルゴリズムを効果的に実装するのに十分なコードを書いていませんでした。このように実装するためには、さらに多くのコードを書く必要があります。

if (n.getFirstName().charAt(n.getFirstName().length() - 1) == c) { 

これはあなたの脳にロードして理解するのに適しています。受け入れられた答えは、一時的な変数に名前を最初に取得することによって、それを少し破った。それは賢明な最適化です。私は一時変数に最後の文字を取得することによって別のステップを壊した。実動システムではそれほど遠くないでしょうが、これはあなたの学習段階です。各行が行う操作の数を最小限に抑えるようにしてください。

できるだけ多くのコードをできるだけ少数のキャラクターで書く傾向がある場合は、スタック交換ネットワークでいくつかのコードゴルフゲームを見てください。ゲームは、できるだけ多くの言語機能を悪用して、実際に短い、トリックなコードを作ることです。ほとんどすべての勝者は、決して決して、決して決して、今までに正常なコーダーによって維持されていないという証拠として立派になります。

* Nameオブジェクトからファーストネームが取得されないバグ

関連する問題