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

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

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

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

Q&A

解決済

2回答

1293閲覧

匿名クラス・ラムダ式の引数について

Navina

総合スコア37

Java

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

0グッド

0クリップ

投稿2020/06/17 00:35

今年より新入社員としてJavaの勉強をしているものです。

匿名クラス・ラムダ式の学習を進めていくうえでどうしてもわからない(腑に落ちない)箇所があるため質問することにいたしました。

java

1package sort ; 2 3public class Member implements Comparable<Member>{ 4 private int id; 5 private String name; 6 7 public Member(int id, String name) { 8 this.id = id; 9 this.name = name; 10 } 11 12 public int getId() { 13 return id; 14 } 15 16 public String getName() { 17 return name; 18 } 19 20 public void setId(int id) { 21 this.id = id; 22 } 23 24 public void setName(String name) { 25 this.name = name; 26 } 27 @Override 28 public int compareTo(Member m) { 29 return Integer.compare(id, m.id); 30 } 31 @Override 32 public int hashCode() { 33 final int prime = 31; 34 int result = 1; 35 result = prime * result + id; 36 return result; 37 } 38 39 @Override 40 public boolean equals(Object obj) { 41 if(this == obj) 42 return true; 43 if(obj == null) 44 return false; 45 if(getClass() != obj.getClass()) 46 return false; 47 Member other = (Member) obj; 48 if(id != other.id) 49 return false; 50 return true; 51 } 52 @Override 53 public String toString() { 54 return "Member [id=" + id + ", name=" + name + "]"; 55 } 56 57} 58

java

1package sample; 2import java.util.*; 3public class SortExample { 4 public static void main(String[] args) { 5 6 List<Member> list = Arrays.asList( new Member(115, "たなか"), 7 new Member(120, "きむら"), 8 new Member(108, "さとう"), 9 new Member(105, "やました"), 10 new Member(112, "すずき") ); 11 list.sort(new Comparator<Member>() { 12 public int compare(Member 『o1』, Member 『o2』) { 13 String s1 = o1.getName(), s2=o2.getName(); 14 return s1.compareTo(s2); 15 } 16 }); 17 18 for(Member m : list) { 19 System.out.println(m); 20 } 21 } 22} 23

上記コードの中で『』に囲まれている箇所、compareメソッドの内のMember o1,o2についてです。
これらの引数には具体的にどういった値が入ってくるのかがいまいち理解できません。
今までの勉強の中では
Member o1 = new Member(001, "OOO");
Member o2 = new Member(002, "XXX");
といったように具体出来な値が定義されていおり、
その中のo1.getNumber(),o2.getNumber()の値を比較し、0or1を返しバブルソートして、
実際にソートを実行していると解釈していますが、
今回のこのコードに関してはo1,o2に具体出来な値が入ってきていないにも関わらず、ソートできてしますのが非常に謎です。

また、ラムダ式も同じく
結局『』のo1,o2とはいったい何者なのか?
これが分からないと処理がわかなくて非常に困っています。

java

1package sample; 2 3import java.util.Arrays; 4import java.util.List; 5 6 7public class SortExample { 8 public static void main(String[] args) { 9 List<Member> list = Arrays.asList( new Member(115, "たなか"), 10 new Member(120, "きむら"), 11 new Member(108, "さとう"), 12 new Member(105, "やました"), 13 new Member(112, "すずき") ); 14 15 list.sort((o1, o2)->o1.getName().compareTo(o2.getName())); 16 17 for(Member m : list) { 18 System.out.println(m); 19 } 20 } 21} 22

長文となってしまいましたが、
どなたかご教授いただけると幸いです。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

今回のこのコードに関してはo1,o2に具体出来な値が入ってきていないにも関わらず

具体的な値を流し込むのはsortの役割です。

投稿2020/06/17 01:13

maisumakun

総合スコア145121

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

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

0

ベストアンサー

次のように出力を噛ませてみて下さい。

Java

1list.sort(new Comparator<Member>() { 2 public int compare(Member o1, Member o2) { 3 String s1 = o1.getName(), s2 = o2.getName(); 4 System.out.println(s1 + "と" + s2 "を比較します。"); 5 6 return s1.compareTo(s2); 7 } 8});

Java

1list.sort((o1, o2) -> { 2 String s1 = o1.getName(), s2 = o2.getName(); 3 System.out.println(s1 + "と" + s2 "を比較します。"); 4 5 return s1.compareTo(s2); 6});

実際にどの要素を比較するかどうかは、sortメソッドが内部的に決定します。

投稿2020/06/17 00:41

編集2020/06/17 00:42
LouiS0616

総合スコア35658

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

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

Navina

2020/06/17 01:18

では詳しく知りたい場合はsortメソッドを処理を追えばいいんでしょうかね? 下記のコードのように自信でリストアップメソッドを作った際も ラムダ式のbookにはランダムで値が入り 3000以下のものが抽出される という解釈になるのでしょうか? //--------------------------------------------------------------------------------------- package sample; import java.time.LocalDate; import java.util.Arrays; import java.util.List; interface Predicate { boolean test(Book book); } public class MyList { // リストアップを実行 public static void main(String[] args) { List<Book> list = Arrays.asList( new Book("120", "german", "Janssen", LocalDate.of(2017, 9, 18), 1500), new Book("310", "japanese", "田中宏", LocalDate.of(2018, 3, 5), 5500), new Book("400", "english", "Alcott", LocalDate.of(2018, 2, 11), 4500), new Book("100", "japanese", "森下花", LocalDate.of(2018, 1, 10), 2200), new Book("410", "english", "Hunter", LocalDate.of(2017, 12, 1), 5500)); // listup(list, book -> book.getPrice() <= 3000); //listup(list, book -> "田中宏".equals(book.getAuthor())); } // リストアップメソッド public static void listup(List<Book> list, Predicate p) { for(Book book : list) { if(p.test(book)) { // インタフェースのメソッドで判定する System.out.println(book); } } } } //---------------------------------------------------------------------
LouiS0616

2020/06/17 01:22 編集

> では詳しく知りたい場合はsortメソッドを処理を追えばいいんでしょうかね? かなり大変だと思いますけれど、処理を追うことは可能です。 --- > 下記のコードのように自信でリストアップメソッドを作った際も > ラムダ式のbookにはランダムで値が入り > 3000以下のものが抽出される > という解釈になるのでしょうか? 書いているとおりに動きます。リストアップメソッドには『ランダムに要素を選択する』処理が無いように見えますが。
Navina

2020/06/17 01:38

ありがとうございます。 sortメソッドに関しては「そういう仕組みなんだ」で覚えておき、もう少し知識がついた後処理を追ってみるようにしてみます。 ラムダ式に関してはまだ理解不十分といった感じですが… もう少し勉強してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問