teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

「負のほうに」を削除、メソッド参照Comparator

2017/08/26 14:47

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -49,4 +49,9 @@
49
49
  今このmaxメソッドに渡しているComparatorは、2つの文字列のlength()、つまり長さの差を取ることで、長さの大小を比較していることになります。この符号が正か負かで、どちらが長いかが決定できます。
50
50
  そして負であるとき、つまりd1のほうが短いとき、メソッドの設計の話からd1が昇順で先に並ぶことになります。
51
51
  maxメソッド内ではこれを自動でやってくれるのでd1とかd2に当たるものが何か外部からは見えませんが、「短いものから先に並ぶ」という要件にはなっています。
52
- ※今回の場合は「文字列の長さ」のため、両方0以上の値であるから引き算で比較できたが、一般のint値同士を引き算で比較するとオーバーフローする恐れがあるので注意が必要
52
+ ※今回の場合は「文字列の長さ」のため、両方0以上の値であるから引き算で比較できたが、一般のint値同士を引き算で比較するとオーバーフローする恐れがあるので注意が必要
53
+ また次のように書くことも可能
54
+ ```java
55
+ Optional<String> result2 = data.stream().max(Comparator.comparingInt(String::length));
56
+ ```
57
+ こうすることで、「文字列の長さで比較」ということを明示的にできる

1

\[

2017/08/26 14:47

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -49,4 +49,4 @@
49
49
  今このmaxメソッドに渡しているComparatorは、2つの文字列のlength()、つまり長さの差を取ることで、長さの大小を比較していることになります。この符号が正か負かで、どちらが長いかが決定できます。
50
50
  そして負であるとき、つまりd1のほうが短いとき、メソッドの設計の話からd1が昇順で先に並ぶことになります。
51
51
  maxメソッド内ではこれを自動でやってくれるのでd1とかd2に当たるものが何か外部からは見えませんが、「短いものから先に並ぶ」という要件にはなっています。
52
- ※今回の場合は「文字列の長さ」のため、両方0以上の値であるから引き算で比較できたが、一般のint値同士を引き算で比較すると負のほうにオーバーフローする恐れがあるので注意が必要
52
+ ※今回の場合は「文字列の長さ」のため、両方0以上の値であるから引き算で比較できたが、一般のint値同士を引き算で比較するとオーバーフローする恐れがあるので注意が必要