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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

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

Q&A

解決済

2回答

1168閲覧

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

Yhaya

総合スコア439

Java

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

0グッド

0クリップ

投稿2018/01/22 10:05

#解決したい問題
文字列が与えられて、何文字中何文字がa-m以外の文字かを返す

Java

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

#問題のコード

Java

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

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

よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

分割して解説します

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'));

投稿2018/01/22 11:35

snicmakino

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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さんのページには大変お世話になりました。記述はあっさり目ですが非常に豊富な例と核心をついたコメントが載っていてとてもよいページだと思います)

投稿2018/01/22 11:29

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問