CollectionsとLambda式

Similar documents
JAVA とテンプレート

文字列操作と正規表現

目的 泡立ち法を例に Comparableインターフェイスの実装 抽象クラスの利用 型パラメタの利用 比較 入替 の回数を計測

2. データ構造ヒープに保存するデータは 番号付けられて保存される 従って リスト L として保存することとする 3. アルゴリズム 3.1. 要素の追加新しい要素の追加は リストの終端に置くことで開始する つまり 最下層の一番右 または新たに最下層を生成してその一番左となる この後 この要素を正し

1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値

Quick Sort 計算機アルゴリズム特論 :2017 年度 只木進一

微分方程式 モデリングとシミュレーション

二分木ヒープとは 集合 リストから 最小な 要素を取り出す 二分木ヒープは そのための標準的データ構造 二分木ヒープを保存するデータ構造 二分木ヒープの操作のメソッド 対象となるデータクラス 識別のためのlabelフィールド 値を保持するvalueフィールド

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

JAVA入門

Microsoft PowerPoint ppt

JAVA入門

今回の内容 グラフとオブジェクト指向プログラミング Java を使う理由 Java の基本 Javaのライブラリ 開発 実行 クラスの再利用 クラス継承 抽象クラス 開発の要点

グラフの探索 JAVA での実装

Microsoft Word - NonGenList.doc

人工知能入門

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

プログラミング基礎I(再)

Microsoft PowerPoint - Pro110111

大容量情報検索論

JavaプログラミングⅠ

グラフと組み合わせ 課題 7 ( 解答例 ) 2013/5/27 1 列挙 n 個の文字の集合 { } S = a, a,, an の全てからなる文字列 つまり同じ文字を含まない 長さ n の文字列を列挙する 方法を考える 1. 何通りの文字列があるかを答えなさい また そのことが正しい

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

リファレンス,配列 例外処理

10/ / /30 3. ( ) 11/ 6 4. UNIX + C socket 11/13 5. ( ) C 11/20 6. http, CGI Perl 11/27 7. ( ) Perl 12/ 4 8. Windows Winsock 12/11 9. JAV

シミュレーションの簡単な例 GUI 無しのシミュレーションを作る GUI を作る パラメタを設定するデモンストレーションをする 2 オブジェクト指向プログラミング特論

Microsoft Word - NonGenTree.doc

問題1 以下に示すプログラムは、次の処理をするプログラムである

ALG ppt

Prog1_15th

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問


untitled

グラフを表すデータ構造 Javaでの実装

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 3 回コレクションと例外処理 テクノロジックアート 瀬嘉秀

JavaプログラミングⅠ

デジタル表現論・第4回


Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

解答上の注意 1 解答は 解答 紙の問題番号に対応した解答欄にマークしなさい 2 選択肢は 問ごとに 意されています 問 1の選択肢は 問 2で使 しません 3 選択肢は量が多いため 探しやすさの観点よりグループ分けされています グループ分けに合わせて解答欄が区切られていますが 横 1 列で問題 1

K227 Java 2

108 頁通過テスト 2. の本文 111 頁紹介文 136 頁練習 5-1 プログラム 136 頁練習 5-1 問 2 末尾に句点追加 158 頁練習問題文 161 頁練習 2-2 コメント文 166 頁練習 3-1 問 1 クラス名を挿入 178 頁通過テスト 3 文字 s を削除 180 頁コ

ALG ppt

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

問題 01 以下は コンソールより年齢を入力させ その年齢にあった料金を表示するプログラムである 年齢ごとの金額は以下の通りである 年齢の範囲金額 0 歳以上 6 歳以下 120 円 7 歳以上 65 歳未満 200 円 65 歳以上無料 package j1.exam02; import java

プログラミング入門1

問題1 以下に示すプログラムは、次の処理をするプログラムである

5 継承とは クラス図 98 7 参照の自動型変換 参照の自動型変換 クラス図の見方 クラス図の書き方 継承 継承してクラスを作る インスタンスの初期化 継承の効果を確認する


Javaセキュアコーディングセミナー2013東京第1回 演習の解説

** 平成 16 年度 FE 午後問題 Java** 示現塾プロジェクトマネージャ テクニカルエンジニア ( ネットワーク ) など各種セミナーを開催中!! 開催日 受講料 カリキュラム等 詳しくは 今すぐアクセス!! 平成 16

基礎計算機演習 実習課題No6

class IntCell { private int value ; int getvalue() {return value; private IntCell next; IntCell next() {return next; IntCell(int value) {this.value =

Java (5) 1 Lesson 3: x 2 +4x +5 f(x) =x 2 +4x +5 x f(10) x Java , 3.0,..., 10.0, 1.0, 2.0,... flow rate (m**3/s) "flow

GEC-Java

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

Sort-of-List-Map(A)

新・明解Java入門

Microsoft PowerPoint - lec06 [互換モード]

Javaプログラムの実行手順

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

第二回独習 Java ゼミ 第二章クラスとメソッド 2.1 メソッドの構造 2.2 静的メソッドと静的変数の概要 2.3 インスタンスメソッドとインスタンス変数の概要 2.4 Integerクラス 2006/04/19 神津健太

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

アルゴリズムとデータ構造1

Java (9) 1 Lesson Java System.out.println() 1 Java API 1 Java Java 1

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

PowerPoint プレゼンテーション

動的なデザインパターン

明解Javaによるアルゴリズムとデータ構造

class IntCell { private int value ; int getvalue() {return value; private IntCell next; IntCell next() {return next; IntCell(int value) {this.value =

Java プログラミング Ⅰ 3 回目変数 変数 変 数 一時的に値を記憶させておく機能型 ( データ型 ) と識別子をもつ 2 型 ( データ型 ) 変数の種類型に応じて記憶できる値の種類や範囲が決まる 型 値の種類 値の範囲 boolean 真偽値 true / false char 2バイト文

オブジェクト指向プログラミング・同演習 5月21日演習課題

Microsoft PowerPoint - algo ppt [互換モード]

デジタル表現論・第6回

問 次の Fortran プログラムの説明及びプログラムを読んで、設問に答えよ。

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

JavaプログラミングⅠ

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

GEC-Java

. IDE JIVE[1][] Eclipse Java ( 1) Java Platform Debugger Architecture [5] 3. Eclipse GUI JIVE 3.1 Eclipse ( ) 1 JIVE Java [3] IDE c 016 Information Pr

Microsoft Word - CompA-Ex doc

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

DVIOUT-exer

3 Java 3.1 Hello World! Hello World public class HelloWorld { public static void main(string[] args) { System.out.println("Hello World");

IT プロジェクト

プログラミング入門1

memo

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

Java学習教材

Java講座

メソッドのまとめ

GEC-Java

2016 年度 JAVA 講座第六週目 目次 パッケージ... 2 パッケージの作成... 2 パッケージの使用方法... 3 異なるパッケージ同名クラスの宣言... 4 パッケージの側面から見たアクセス修飾子... 4 ラッパークラス... 5 ラッパークラス利用法:キャスト... 5 ラッパーク

PowerPoint プレゼンテーション

JavaプログラミングⅠ

6-1

Javaセキュアコーディングセミナー東京 第3回 入出力(File, Stream)と例外時の動作 演習解説

アルゴリズムとデータ構造1

やさしいJavaプログラミング -Great Ideas for Java Programming サンプルPDF

Javaによるアルゴリズムとデータ構造

Transcription:

CollectionとLambda 式 オブジェクト指向プログラミング特論 2018 年度只木進一 : 工学系研究科

2 同じクラスのインスタンスの集 合 順序のあるもの :Listなど 待ち行列 :Queue 要素の重複を許さないもの :Set 鍵と値の組 :Map

3 Generic 型パラメタを明示することで コンパイラが型の整合性を確認できるようにすること Collection などでは 保存する型を明示することで 出し入れを安全に行う

4 java.util.collection オブジェクトの集まりを保存するための最上位のインターフェース 保存する型を指定 基本的なメソッドが定義されている boolean add() : 要素を追加 boolean contains() : 要素を含むか否か boolean isempty() : 空か否か boolean remove() : 指定された要素を削除 int size() : 要素数 Stream stream() : 逐次的 stream を返す

5 java.util.collection から派生し たインターフェース Collection 注意 :Map は別種類 List Queue Set SortedSet 全て Interface

6 java.util.list 要素を順序つけて保存する 基本的メソッド boolean add() : 要素を終端に追加 失敗すると例外を発生 E get() : 指定された位置の要素 int indexof() : 指定された要素の位置 E set() : 指定された位置に指定された要素を置く 戻り値は元の要素

7 java.util.list の実装 List AbstractList ArrayList LinkedList 要素へのアクセスが速い 要素の追加 削除が速い Stack

8 java.util.queue 待ち行列 FIFO を想定したメソッド 失敗した際に例外を返すメソッドと特殊な値を返すメソッド 動作 失敗時に例外を返す 失敗時に特殊な値を返す 終端へ追加 add offer false 先頭の取出 remove poll null 先頭の値 element peek null 失敗時の値

9 java.util.queue の実装 Queue AbstractQueue ArrayDequeue LinkedList PriorityQueue

10 java.util.set 要素の重複を許さない equal() が true となることで判断 要素が入っているかの有無しかメソッドが無い

11 java.util.set の実装 Set AbstractSet EnumSet HashSet TreeSet

12 Collections クラス コレクション操作メソッド群 探索 最大 最小 逆順 スレッド保護 : 後述 整列 スワップ

13 Arrays クラス 配列関連メソッド群 配列のリスト化 ( 固定長 ) 探索 配列コピー 比較 整列 文字列化

14 java.util.map 鍵と値の組を保存 基本的メソッド V get() : 鍵に対応する値 Set<K> keyset() : 鍵の集合 V put() : 鍵と値を保存 Collection<V> values() : 値のコレクション

15 java.util.map の実装 Map AbstractMap EnumMap HashMap TreeMap

16 Thread と Collection Collection に対して複数の thread から読み書きすることに対する保護 Collections クラスの static methods Collections.synchronizedList() Collections.synchornizedSet() 他

17 Collection の全ての要素に対す る操作 拡張されたfor List<T> list; for(t t : list ){ StreamとLambda 式の利用

18 java.util.stream.stream Collection の要素を stream へ 要素の一つ一つを取り出す ( 順序は別 ) 主要なメソッド filter(): 指定されたものを抽出 foreach(): 各要素に foreachordered(): 順番に reduce(): 集約

19 Lambda 式 関数を変数として扱う方法 C/C++ ならば関数ポインタを利用 Java ではインターフェースを利用 java.util.function.* に様々なインターフェース 自分で定義しても良い

20 java.util.function.* の例 BinaryOperator<T> 同じ型 T の 2 つのオペランドに作用してオペランドと同じ型の結果を生成する演算 DoubleBinaryOperator 2 つの double 値オペランドに作用して double 値の結果を生成する演算 DoubleFunction<R> 1 つの double 値引数を受け取って結果 ( 型 R) を生成する関数

21 Lambda の利用 Stream とともに Collection の要素に対する処理 Comparator 要素の比較方法

NewMain.java package example; import java.util.arraylist; import java.util.comparator; import java.util.hashmap; import java.util.list; import java.util.map; /** * * @author tadaki public class NewMain { /** * @param args the command line arguments public static void main(string[] args) { int n = 20; Map<Integer, Double> map = new HashMap<>(); for (int i = 0; i < n; i++) { map.put(i, Math.random()); List<Double> list = new ArrayList(); for (Integer i : map.keyset()) { System.out.println(i + "->" + map.get(i)); list.set(i, map.get(i)); for (Double d : list) { System.out.println(d); /* double sum=0.; for(double d:list){ sum += d; // 和 double sum = list.stream().reduce(0., (acc, _item) -> acc + _item); // 最大値 double max = list.stream().max(comparator.naturalorder()).get(); // 条件に合う要素の数 int count = list.stream().filter(d -> (d > 0.5)). map(d -> 1).reduce(0, Integer::sum); 1/2 ページ

NewMain.java 2/2 ページ

ArraysSample.java package example; import java.util.arrays; import java.util.list; /** * * @author tadaki public class ArraysSample { final private int n; private final Integer array[]; public ArraysSample(int n) { this.n = n; array = new Integer[n]; for (int i = 0; i < n; i++) { array[i] = i * i; /** * 配列からリストへ public void convertlist() { List<Integer> list = Arrays.asList(array); // 要素を一つ変更 int m = n / 2; list.set(m, 0); for (int i = 0; i < n; i++) {// 配列側も変更になることの確認 int x = array[i]; int y = list.get(i); System.out.println(i + ": " + x + " " + y); // エラーになる // list.add(1); /** * 要素の探索 * @param key public void search(int key) { int k = Arrays.binarySearch(array, key, (a, b) -> { 1/2 ページ

ArraysSample.java return a - b; ); if (k < 0) { System.out.println("Not found"); else { System.out.println(array[k] + " at " + k); /** * 配列コピー * @param m * @return public Integer[] newarray(int m) { Integer array2[] = Arrays.copyOf(array, m * n); System.out.println("length of b is " + array2.length); for (int i = 0; i < m * n; i++) { array2[i] = (int) (100 * Math.random()); return array2; /** * @param args the command line arguments public static void main(string[] args) { int n = 10; int key = n / 2; ArraysSample sys = new ArraysSample(n); sys.convertlist(); sys.search(n / 2); sys.search((n - 2) * (n - 2)); Integer array2[] = sys.newarray(2); // 整列 Arrays.sort(array2, (a, b) -> { return a - b; ); 2/2 ページ

Main0.java package sortexample; import java.util.arrays; import java.util.list; /** * * @author tadaki public class Main0 { /** * @param args the command line arguments static public void main(string args[]) { Student[] input = { new Student("Tom", 1, 88), new Student("Jane", 2, 80), new Student("Ray", 3, 70), new Student("Kim", 4, 75), new Student("Jeff", 5, 85), new Student("Ann", 6, 75), new Student("Beth", 7, 90) ; MergeSort<Student> sort = new MergeSort<>( Arrays.asList(input), (a, b) -> {//comparator を定義 int ans = a.getrecord() - b.getrecord(); if (ans == 0) { return a.id - b.id; return ans; ); List<Student> output = sort.sort(); if (sort.issorted()) { output.stream().foreachordered(s -> System.out.println(s)); 1/1 ページ

MergeSort.java package sortexample; import java.util.arraylist; import java.util.comparator; import java.util.list; /** * MergeSort * * @author tadaki * @param <T> public class MergeSort<T> { final private List<T> list; final private Comparator<T> comparator; public MergeSort(List<T> list,comparator<t> comparator) { this.list = list; this.comparator=comparator; /** * 整列の実行 * * @return 整列済みのリスト public List<T> sort() { sortsub(0, list.size()); return list; /** * 再帰的整列 * * @param left リストの整列対象のうち左端のインデクス * @param right リストの整列対象のうち右端のインデクス +1 private void sortsub(int left, int right) { if (right <= left) { throw new IllegalArgumentException("illegal range"); if (right == left + 1) { return; int middle = (right + left) / 2; 1/3 ページ

MergeSort.java // 再帰呼び出し sortsub(left, middle); sortsub(middle, right); // リストの結合 List<T> tmplist = mergelist(left, middle, right); for (int p = 0; p < tmplist.size(); p++) { list.set(left + p, tmplist.get(p)); /** * リストの結合 * * @param left 左端 * @param middle 右側要素の先頭 * @param right 右側要素の終端 +1 * @return private List<T> mergelist(int left, int middle, int right) { List<T> tmp = new ArrayList<>(); int leftindex = left; int rightindex = middle; while (leftindex < middle rightindex < right) { if (leftindex >= middle) {// 左側終了 for (int k = rightindex; k < right; k++) { tmp.add(list.get(k)); return tmp; if (rightindex >= right) {// 右側終了 for (int k = leftindex; k < middle; k++) { tmp.add(list.get(k)); return tmp; if (less(leftindex, rightindex)) { tmp.add(list.get(leftindex)); leftindex++; else { tmp.add(list.get(rightindex)); rightindex++; return tmp; 2/3 ページ

MergeSort.java /** * リストの i 番の要素が j 番の要素より小さい場合に真 * @param i * @param j * @return private boolean less(int i, int j) { return (comparator.compare(list.get(i),list.get(j))<0); public boolean issorted(){ boolean b = true; for(int i=0;i<list.size()-1;i++){ if(!less(i,i+1))return false; return b; 3/3 ページ

Student.java package sortexample; /** * * @author tadaki public class Student { final String name;// 名前 final int id;// 番号 private int record; public Student(String name, int id, int record) { this.name = name; this.id = id; this.record = record; public int getrecord() { return record; public void setrecord(int record) { this.record = record; public String tostring() { return String.valueOf(id) + ":"+name +":"+ String.valueOf(record); 1/1 ページ