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

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

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

グラフの探索 JAVA での実装

JAVA とテンプレート

最初に

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

Microsoft PowerPoint ppt

文字列操作と正規表現

目 次 Java GUI 3 1 概要 クラス構成 ソースコード例 課題...7 i

JavaプログラミングⅠ

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

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

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

2 static final int DO NOTHING ON CLOSE static final int HIDE ON CLOSE static final int DISPOSE ON CLOSE static final int EXIT ON CLOSE void setvisible

DVIOUT-exer

. 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

のようにする 上の例では GeneralPath を new するときに コンストラクタに何も指定していないが 直線を表す Line, 四角形を表す Rectangle などを引数に与えてもよい 矢印を作成するメソッドの引数矢印を表す GeneralPath を生成するために getarrowpat

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

JavaプログラミングⅠ

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

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

Java - Visual Editor

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

CollectionsとLambda式

ガイダンス

GUIプログラムⅣ

ガイダンス

新・明解Java入門

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

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

基本情報STEP UP演習Java対策

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

PowerPoint Presentation

Microsoft PowerPoint - OOP.pptx

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

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

ガイダンス

PowerPoint Presentation

手書認識 グラフ描画 Step2-2 手書認識 : 認識結果を PaintPanel で描画する < 属性付き文字列 AttributedString> 標準出力では分かりにくいうえに認識結果を使えないので 認識するごとに PaintPanel に文字を描画することにする ここで 数式はただの文字列

ガイダンス

Microsoft PowerPoint - lec06 [互換モード]

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

IT プロジェクト

JavaプログラミングⅠ

6 p.1 6 Java GUI GUI paintcomponent GUI mouseclicked, keypressed, actionperformed mouseclicked paintcomponent thread, 1 GUI 6.0.2, mutlithread C

PowerPoint プレゼンテーション

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

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

Java演習(4) -- 変数と型 --

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

Prog2_12th

1 Java Java GUI , 2 2 jlabel1 jlabel2 jlabel3 jtextfield1 jtextfield2 jtextfield3 jbutton1 jtextfield1 jtextfield2 jtextfield3

Thread

第1章 ビジュアルプログラミング入門

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

Java講座

GEC-Java

ガイダンス

226

JAVA入門

< F2D B838A835882CC8CF68EAE2E6A7464>

Java言語 第1回

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

GEC-Java

Java 2 - Lesson01

: : : TSTank 2

メディプロ1 Javaプログラミング補足資料.ppt

Prog2_11th

Javaの作成の前に

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


Microsoft PowerPoint pptx

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

Graphical User Interface 描画する

JavaプログラミングⅠ

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

K227 Java 2

PowerPoint プレゼンテーション

Microsoft PowerPoint - chap10_OOP.ppt

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

Program Design (プログラム設計)

10/31 Java AWTの基本構造(Frameクラスの継承) 演習課題資料

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Javaプログラムの実行手順

人工知能入門

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

ALG ppt

JavaプログラミングⅠ

Microsoft Word - NonGenTree.doc

untitled

(Eclipse\202\305\212w\202\324Java2\215\374.pdf)

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

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

Prog1_12th

5 p Point int Java p Point Point p; p = new Point(); Point instance, p Point int 2 Point Point p = new Point(); p.x = 1; p.y = 2;

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

Animals サンプル Step3 張り付けた動物の上をクリックすると それぞれの鳴き声で鳴く その鳴く間 一定時間 ( ここでは 1 秒間 ) 画像が別のものに変わる <アニメーションの基礎 : タイマーについて> アニメーションは アプリケーションが指定する間 一定間隔でどんどん画像をおきかえ

2004/11/23 オブジェクト指向プログラミング - モデル図とシーケンス図の表現方法 - オブジェクト指向プログラミング (OOP:ObjectOrientedPrograming) オブジェクト指向プログラミング言語 (OOPL) Java,C++,Delphi(Pascal),Visual

PowerPoint Presentation

Transcription:

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

なぜ JAVA を使うか グラフの実装 頂点 弧及びその関連を記述する 頂点の数 弧の数を柔軟に変える必要あり グラフ探索など リンクをたどる必要あり オブジェクト指向言語が向いている オブジェクト数の柔軟な変更 再帰的関数 メソッド

リストなどの豊富なライブラリ java.util.vector など 使い易い開発環境 プロジェクト管理 クラス管理 GUI による支援 プログラミング支援 メソッド名補完 javadoc グラフィックスを容易に作成可能 javax.swing コンポーネント OSに依らずにプログラミング可能 豊富な文献

JAVA 開発環境 NetBeans http://www.netbeans.org/ http://www.netbeans.jp/ GUI 開発が容易 UMLとの連携ができる Eclipse http://www.eclipse.org/

グラフの構造を記述するクラス パッケージgraphLib graphlib.graph グラフ全体 graphlib.vertex 頂点 頂点を始点とする弧 頂点を2 次元面に表示するための座標 graphlib.arc 弧の始点と終点

クラスの関係 グラフ 弧一覧 頂点 弧 頂点一覧 頂点 弧 頂点 弧 頂点 頂点

GRAPH クラス : フィールド グラフのラベル protected String name = null; 頂点の一覧 protected Vector<Vertex> vertexes = null; 弧の一覧 protected Vector<Arc> arcs = null; 有向グラフであるか protected boolean directed = true; 隣接行列 protected boolean adjacent[][] = null; protected boolean connectedness[][] = null; private HashMap<Vertex, Vertex> map = null; private HashMap<Arc, Arc> amap = null;

GRAPH クラス : 主要メソッド public Graph(String name) コンストラクタ public Graph(final Graph graph) コピーコンストラクタ public Vertex addvertex(string name) 頂点追加 public void addvertex(vertex v) 頂点追加 public Arc addarc(string fromname, String toname, String name) 弧追加 public Arc addarc(vertex from, Vertex to, String name) 弧追加 public void setdirected(boolean b) 有向 無向を設定 public Vector<Vertex> getvertexes() 頂点一覧を取得 public Vector<Arc> getarcs() 弧一覧を取得

VERTEX クラス : フィールド 頂点のラベル private String name; 頂点を始点とする弧のリスト private Vector<Arc> arcs = null; 頂点の位置座標 private Point2D.Double point = null;

VERTEX クラス : 主要メソッド public Vertex(String name) コンストラクタ public void addarc(arc a) 頂点を始点とする弧を追加 public int degree() 次数を返す public Vector<Arc> getarcs() 頂点を始点とする弧の一覧を取得 public Point2D.Double getpoint() 頂点の座標を取得 public void setpoint(point2d.double p) 頂点の座標を設定

ARC クラス : フィールド 始点 private Vertex fromvertex = null; 終点 private Vertex tovertex = null; 弧のラベル private String name; 弧の重み private double weight; private boolean namewithweight = false; 弧を流れる流量 private double flow; private boolean namewithflow = false;

ARC クラス : 主要メソッド public Arc(String name) public Vertex from() public Vertex to() public Vertex terminal(vertex v) コンストラクタ弧の始点を返す弧の終点を返す弧の反対側の頂点を返す

グラフの定義 graphlib.graph を拡張 public class Graph0 extends Graph { public Graph0(String name) { super(name); int n = 6; // 頂点の生成 graphlib.vertex vlist[] = new graphlib.vertex[n]; for (int i = 0; i < n; i++) { vlist[i] = new graphlib.vertex(string.valueof(i)); addvertex(vlist[i]); // 頂点の表示座標を設定 double d = 100.; vlist[0].setpoint(d, d);. int k = 0; addarc(vlist[0], vlist[1], String.valueOf(k)); k++; addarc(vlist[0], vlist[1], String.valueOf(k)); k++;

グラフ表示のメインプログラム * 表示の開始 * @param evt 表示開始のボタンイベント private void drawactionperformed(java.awt.event.actionevent evt) { graphexample0 = new graphsamples.graph0(title); グラフの定義 panel.setgraph(graphexample0); グラフをパネルに設定 panel.mkimage(); 作図イメージ生成 settitle(graphexample0.tostring()); タイトル設定 repaint(); 全体再描画

Graph0.java package graphsamples; import graphlib.*; * * @author tadaki public class Graph0 extends Graph { public Graph0(String name) { super(name); int n = 6; // 頂点の生成 graphlib.vertex vlist[] = new graphlib.vertex[n]; for (int i = 0; i < n; i++) { vlist[i] = new graphlib.vertex(string.valueof(i)); addvertex(vlist[i]); // 頂点の表示座標を設定 double d = 100.; vlist[0].setpoint(d, d); vlist[1].setpoint(d, 3 * d); vlist[2].setpoint(2 * d, 2 * d); vlist[3].setpoint(3 * d, d); vlist[4].setpoint(3 * d, 3 * d); vlist[5].setpoint(4 * d, 2 * d); // 弧の定義 int k = 0; addarc(vlist[0], vlist[1], String.valueOf(k)); k++; addarc(vlist[0], vlist[1], String.valueOf(k)); k++; addarc(vlist[0], vlist[2], String.valueOf(k)); k++; addarc(vlist[0], vlist[3], String.valueOf(k)); k++; addarc(vlist[1], vlist[2], String.valueOf(k)); k++; addarc(vlist[1], vlist[4], String.valueOf(k)); k++; addarc(vlist[2], vlist[3], String.valueOf(k)); k++; addarc(vlist[3], vlist[4], String.valueOf(k)); 1/2 ページ

Graph0.java k++; addarc(vlist[4], vlist[2], String.valueOf(k)); k++; addarc(vlist[4], vlist[5], String.valueOf(k)); k++; addarc(vlist[5], vlist[3], String.valueOf(k)); k++; addarc(vlist[5], vlist[5], String.valueOf(k)); 2/2 ページ

Main.java package example0; * 例題 * @author tadaki public class Main extends javax.swing.jframe { private graphlib.graph graphexample0 = null; private String title = "Example0"; Creates new form Main public Main(String title) { initcomponents(); this.title = title; This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. // <editor-fold defaultstate="collapsed" desc="generated Code">//GEN-BEGIN:initComponents private void initcomponents() { buttons = new javax.swing.jpanel(); close = new javax.swing.jbutton(); draw = new javax.swing.jbutton(); panel = new graphdraw.graphpanel(); setdefaultcloseoperation(javax.swing.windowconstants.exit_on_close); 1/3 ページ buttons.setbackground(new java.awt.color(204, 204, 255)); close.setbackground(new java.awt.color(0, 153, 204)); close.settext("close" ); close.addactionlistener(new java.awt.event.actionlistener() { public void actionperformed(java.awt.event.actionevent evt) { closeactionperformed(evt); ); buttons.add(close);

Main.java draw.setbackground(new java.awt.color(0, 153, 204)); draw.settext("draw" ); draw.addactionlistener(new java.awt.event.actionlistener() { public void actionperformed(java.awt.event.actionevent evt) { drawactionperformed(evt); ); buttons.add(draw); getcontentpane().add(buttons, java.awt.borderlayout.north); panel.setpreferredsize(new java.awt.dimension(500, 400)); getcontentpane().add(panel, java.awt.borderlayout.center); pack(); // </editor-fold>//gen-end:initcomponents * 表示の開始 * @param evt 表示開始のボタンイベント private void drawactionperformed(java.awt.event.actionevent evt) {//GEN-FIRST:event_drawActionPerformed graphexample0 = new graphsamples.graph0(title); グラフの定義 panel.setgraph(graphexample0); グラフをパネルに設定 panel.mkimage(); 作図イメージ生成 settitle(graphexample0.tostring()); タイトル設定 repaint(); 全体再描画 //GEN-LAST:event_drawActionPerformed * 終了 * @param evt 終了のボタンイベント private void closeactionperformed(java.awt.event.actionevent evt) {//GEN-FIRST:event_closeActionPerformed dispose(); //GEN-LAST:event_closeActionPerformed 2/3 ページ

Main.java * 開始 * @param args the command line arguments public static void main(string args[]) { java.awt.eventqueue.invokelater(new Runnable() { @Override public void run() { new Main("Example 0").setVisible(true ); ); // Variables declaration - do not modify//gen-begin:variables private javax.swing.jpanel buttons; private javax.swing.jbutton close; private javax.swing.jbutton draw; private graphdraw.graphpanel panel; // End of variables declaration//gen-end:variables 3/3 ページ

Student.java package StudentSample2; * 生徒のクラス * Comparable インターフェイスの例 * @author tadaki public class Student implements Comparable<Student> { private String name = null;// 名前 private int studentid = 0; // 学生番号 private int record = 0; // 点数 * コンストラクタ * @param name 名前 * @param studentid 学生番号 public Student(String name, int studentid) { this.name = new String(name); this.studentid = studentid; * 学生番号取得 * @return 取得した学生番号 public int getstudentid() { return studentid; * 名前取得 * @return 取得した名前 public String getname() { return name; * 得点取得 * @return 取得した得点 public int getrecord() { 1/2 ページ

Student.java return record; * 得点設定 * @param record 設定する得点 public void setrecord(int record) { this.record = record; @Override * Student インスタンスの比較 * インターフェイス Comparable で必須 public int compareto(student o) { int k = 1; if (this.getrecord() < o.getrecord()) { k = -1; return k; 2/2 ページ

StudentRecord.java package StudentSample2; import java.util.vector; * * @author tadaki public class StudentRecord { private Vector<Student> students = null;// 生徒一覧 名前一覧 private String names[] = { "Aoyama", "Asou", "Baba", "Chou", "Egashira", "Eto", "Funaki", "Goto", "Gunji", "Hara", "Hashimoto", "Ikeuchi", "Ito", "Jo", "Kayama", "Mori", "Naito", "Tada", "Yamada", "Yoshida" ; コンストラクタ public StudentRecord() { // 生徒一覧を初期化 students = new Vector<Student>(); ; // 登録 for (int i = 0; i < names.length; i++) { Student s = new Student(names[i], 1000 + i); s.setrecord((int) (100 * Math.random())); students.add(s); * 学生一覧印刷 public void liststudents() { // 拡張された for ループ for (Student s : getstudents()) { System.out.print(String.valueOf(s.getStudentID()) + ":" + s.getname() + ":" ); System.out.println(String.valueOf(s.getRecord())); 1/2 ページ

StudentRecord.java * 学生一覧取得 * @return 学生一覧の Vector public Vector<Student> getstudents() { return students; * ソートの実行 * @param <T> Comparable インターフェイスを実装したクラス * @param t Vector<T> public static <T extends Comparable<T>> void sort(vector<t> t) { for (int i = t.size(); i > 0; i--) { for (int j = 0; j < i - 1; j++) { if (t.get(j).compareto(t.get(j+1)) > 0) { T c = t.get(j); t.set(j, t.get(j + 1)); t.set(j + 1, c); * @param args the command line arguments public static void main(string[] args) { StudentRecord studentrecord = new StudentRecord(); StudentRecord.sort(studentRecord.getStudents()); studentrecord.liststudents(); 2/2 ページ