質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.77%

  • Java

    13168questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Javaのコードの意味がわからない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 145

Yhaya

score 65

解決したい問題

文字列が与えられて、何文字中何文字がa-m以外の文字かを返す

prinertError("abcdefx") -> "1/7"   #"x"だけがa-m以外の文字

問題のコード

public static String printerError(String s){
    long errs = s.chars().filter(ch -> ch > 'm').count();
    return errs + '/' + s.length();
}


s.char()は何をしているのでしょうか。その後のfilter(ch -> ch > 'm')も何をやっているのかわかりません。

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

分割して解説します

s.chars()                    // ①
    .filter(ch -> ch > 'm')  // ②
    .count();                // ③

 ① s.chars()

s.chars()は、引数で渡されているStringのsを、intStreamに変換しています。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/CharSequence.html#chars--
※ streamとは、便利に扱える配列のようなものです(詳しい使い方は検索してみてください)
※ charは16bitの文字であるため、intに変換することが可能です

 ② .filter(ch -> ch > 'm')

①で作成したintStreamを.filter(ch -> ch > 'm')で、a-m以外の文字で構成されたintStreamに変換しています
※ filterの動作は、中の式がtrueである新たなintStreamを作成します

質問の例の場合、②の時点で(ch > 'm')trueのintStreamが作成されています
filterの中身はlambda式という特殊な式が用いられています

これは(引数 -> 式)という形式で、引数にintStreamの要素が1つずつ渡されて処理されます
詳しくはlambda式 java等で検索してみてください

 ③ .count();

intStreamの要素を数えます。
要素は②でフィルタリングされたものなので、sのa-m以外の文字の数となります

 (ch > 'm')が成立する理由

これは文字コードの順番を利用した式です、
https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_0000-0FFF
数字→英大文字→英小文字の順に並んでいるので、質問された処理は記号や日本語は考えられていない処理と言えるでしょう

その文字が16進数だと何なのかは、以下の処理で確認することができます
System.out.println(Integer.toHexString((int) 'a'));

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

s.charsはs(java.lang.String)に含まれている全ての文字を先頭からひとつづつ並べたようなjava.lang.stream.Streamを返します。ここでいうストリームとは「変換、集約、検索、並べかえ」等々のような一般によく用いられる操作を取り扱いやすくした「一般化された要素の流れ(ストリーム)」を表すものと捉えればよいでしょうか・・・。自分はストリームと言うとjava.io.xxxと混乱しそうなので「列」という言い方をすることもあります。

ちなみに
filterは「前段の列の中から条件によって要素を絞り込み後段へ流し込む操作」
countは「前段の列の要素の数を数えてそれを返す操作」
です。

これらを調べる際「java ストリーム」で検索するとjava.ioにある入出力ストリームの解説がヒットしてしまう(java.util.stream.Streamとは別もの)ので少々やっかいかも知れません。

手始めに
http://www.casleyconsulting.co.jp/blog-engineer/java/【初心者向け】Java8 Stream APIについて知ろう/
とか若干難しいかも知れませんが
http://www.ne.jp/asahi/hishidama/home/tech/java/stream.html

とかいう記事を読み込んでみてはいかがでしょうか。(個人的にhishidamaさんのページには大変お世話になりました。記述はあっさり目ですが非常に豊富な例と核心をついたコメントが載っていてとてもよいページだと思います)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Java エラー 初心者

    public class part01 { public static void main( String[] args ) { String name =

  • 解決済

    Javaのemumのエレガントな使い方

    Javaのenumのエレガントな使い方を探しています。 これまで、①「定数を型安全かつ便利に使えるクラス」ぐらいの認識しかなく、そこまで価値を感じていませんでした。しかし、②

  • 解決済

    非同期処理 wait,notifyAllの使い方

    import java.util.Collections; import java.util.LinkedList; import java.util.List; import j

  • 受付中

    フォルダの中にあるファイルを1つずつ読み込む

    最近Javaで開発を始めました。 複数のファイルが入っているフォルダがあります。 このフォルダから1ファイルずつ開き中身をバッファか配列に読み込むコードを書きたいです。

  • 解決済

    【JAVA】実行してもコンソールに出力されません

    閲覧ありがとうございます。 eclipseを使い、JAVAの課題をしております。 先日この質問サイトで回答を頂き 以下のプログラムを組んだ(ほぼコピペ)のですが 実

  • 解決済

    Servletのルーティング定義について

    前提・実現したいこと Servlet3.0でWebApiを作成しています。 アノテーションでパターンを定義していますが、複数のクラスにルーティングを定義した場合に期待通りに動作

  • 解決済

    偶数だけ出したい

    public class Main { public static void main(String[] args) throws Exception { for (int

  • 解決済

    Java メソッドを変数に格納したい

    以下のコードの for (int i = 1; getSeqFirst5Diff3ByIndex(i) <= num1; i++)の部分が長いので変数で見やすくしたいのですが、メソ

同じタグがついた質問を見る

  • Java

    13168questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。