すずろぐ

人生大逆転を目指す、鈴木俊吾の成長日記

Java JavaFXで簡単なGUI版じゃんけんゲームを作成してみた!

JavaFX - じゃんけんゲームの実行結果

おはようございます、すずしんです。

最近あまりプログラミングをしていませんでしたので…。
久しぶりにJavaのプログラミングをしてみました。

何のプログラムを作成しようかと悩んだのですが…。
どうせなら、GUI付きのプログラム(JavaFX)で作成してみようと思い立ちました。
そして、あまり難しくなさそうなテーマを扱おうということで…。
今回は、簡単な「じゃんけんゲームを作成してみることにしました。

じゃんけんゲームの仕様

今回作成することにしたじゃんけんゲームの仕様は以下のような感じです。

  • コンピュータの手・自分の手・じゃんけんの結果を表示するラベルと、自分の手を選ぶためのボタン(グー・チョキ・パー)から構成される。
  • いずれかの手のボタンを押すと、コンピュータがランダムな手を選びじゃんけんをする。
  • じゃんけんをした時、コンピュータの手・自分の手・じゃんけんの結果を表示する。

じゃんけんゲームのプログラム作成

それでは、ここから実際にじゃんけんゲームを作成していきます。
今回のじゃんけんゲームでは、「Janken.fxml」「janken.css」「JankenController.java」「Janken.java」の4つのファイルを作ります。

Janken.fxmlの作成

Janken.fxmlでは、じゃんけんゲームの画面(GUI)を作成します。
SceneBuilderを使いながら、仕様に沿ってラベルとボタンを配置していきます。
ラベルとボタンの細かい部分は特に指定していませんので、自由に決めてもらって構いませんよ。
自分にとって分かりやすい画面になっていれば問題無いです。

とりあえず、私の場合は以下のような画面構成にしてあります。

JavaFX - じゃんけんゲーム

参考までに、私が作成したJanken.fxmlのコードを載せておきますので…。
もし同じ画面にしたい場合には利用してくださいね。

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>

<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="240.0" prefWidth="360.0" stylesheets="@janken.css" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="jp.suzushin7.sample.janken.JankenController">
  <columnConstraints>
      <ColumnConstraints halignment="CENTER" hgrow="SOMETIMES" />
      <ColumnConstraints halignment="CENTER" hgrow="SOMETIMES" />
      <ColumnConstraints halignment="CENTER" hgrow="SOMETIMES" />
  </columnConstraints>
  <rowConstraints>
    <RowConstraints vgrow="SOMETIMES" />
    <RowConstraints vgrow="SOMETIMES" />
    <RowConstraints vgrow="SOMETIMES" />
    <RowConstraints vgrow="SOMETIMES" />
  </rowConstraints>
   <children>
      <Label fx:id="cpuHandLabel" text="コンピュータの手: -" GridPane.columnSpan="3" />
      <Label fx:id="myHandLabel" text="あなたの手: -" GridPane.columnSpan="3" GridPane.rowIndex="1" />
      <Label fx:id="resultLabel" text="結果: -" GridPane.columnSpan="3" GridPane.rowIndex="2" />
      <Button onAction="#putOutRockHand" text="グー" GridPane.rowIndex="3" />
      <Button onAction="#putOutScissorsHand" text="チョキ" GridPane.columnIndex="1" GridPane.rowIndex="3" />
      <Button onAction="#putOutPaperHand" text="パー" GridPane.columnIndex="2" GridPane.rowIndex="3" />
   </children>
</GridPane>

janken.cssの作成

janken.cssでは、画面に表示するGUI部品の基本的な設定を行います。
ここでは、フォントサイズを20px、ボタンの推奨幅を100pxにしています。

.button, .label {
    -fx-font-size: 20px;
}

.button {
    -fx-pref-width: 100px;
}

JankenController.javaの作成

続いて、コントローラークラスとして「JankenController.java」を作成します。

cpuHandLabel・myHandLabel・resultLabelは、それぞれコンピュータの手・自分の手・じゃんけんの結果を表示するためのラベルです。
putOutRockHand()・putOutScissorsHand()・putOutPaperHand()は、それぞれ自分の手をグー・チョキ・パーとしてじゃんけんをするメソッドです。
これらはdoJanken()メソッドで処理しています。

doJanken()メソッドでは、ラベルの更新メソッドであるupdateLabels()を呼び出しています。
引数として、自分の手(myHand)と相手の手(cpuHand)を渡しています。
この際に、新規の相手の手はgetCpuHand()で取得しています。

updateLabels()では、自分の手・相手の手・じゃんけんの結果を各ラベルに表示させます。
じゃんけんの結果については、getResult()メソッドを使って取得しています。

package jp.suzushin7.sample.janken;

import java.net.URL;
import java.util.Random;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;

public class JankenController implements Initializable {
    private final Random random = new Random();
    private final String[] hands = {
        "グー", "チョキ", "パー"
    };
    
    @FXML private Label cpuHandLabel;
    @FXML private Label myHandLabel;
    @FXML private Label resultLabel;
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
    
    }
    
    @FXML
    private void putOutRockHand() {
        doJanken(0);
    }
    
    @FXML
    private void putOutScissorsHand() {
        doJanken(1);
    }
    
    @FXML
    private void putOutPaperHand() {
        doJanken(2);
    }
    
    private void doJanken(int myHand) {
        updateLabels(myHand, getCpuHand());
    }
    
    private int getCpuHand() {
        return random.nextInt(3);
    }
    
    private String getResult(int myHand, int cpuHand) {
        int r = (myHand - cpuHand + 3) % 3;
        return (r == 2) ? "あなたの勝ち!" : ((r == 1) ? "あなたの負け!" : "あいこ!");
    }
    
    private void updateLabels(int myHand, int cpuHand) {
        cpuHandLabel.setText("コンピュータの手: " + hands[cpuHand]);
        myHandLabel.setText("あなたの手: " + hands[myHand]);
        resultLabel.setText("結果: " + getResult(myHand, cpuHand));
    }
}

Janken.javaの作成

最後に、メインクラスとなるJanken.javaの作成をします。

ここでは、単純にFXMLLoaderを使ってJanken.fxmlをロード、そしてSceneにセットするくらいです。
このアプリケーションのタイトルは「じゃんけん」としてみました。
…そのままですね!

package jp.suzushin7.sample.janken;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Janken extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {        
        Parent root = FXMLLoader.load(getClass().getResource("Janken.fxml"));
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        
        primaryStage.setTitle("じゃんけん");
        primaryStage.show();
    }
    
    public static void main(String[] args) {
        Application.launch(args);
    }
}

じゃんけんゲームの実行結果

それでは、早速プログラムを実行してみます。

プログラムが実行されると、まず以下のような画面が表示されます。

JavaFX - じゃんけんゲーム

この画面上にある、グー・チョキ・パーのいずれかのボタンをクリックすると、コンピュータとじゃんけんができます。
じゃんけん後は、コンピュータの手・自分の手・じゃんけんの結果が画面上に表示されます。
ちなみに、コンピュータはランダムな手を選びますので、じゃんけんをする度に結果が変わります。

JavaFX - じゃんけんゲームの実行結果

ひとこと

今回は、JavaFXを使って簡単なじゃんけんゲームを作成してみました。
JavaFX入門用の題材としては、このじゃんけんゲームはちょうど良いのではないでしょうか?
もし良かったら、あなたもじゃんけんゲームを作成して遊んでみてくださいね。

Java NetBeansでコマンドライン引数を複数指定して実行する方法

NetBeans

こんにちは、すずしんです。

Javaのプログラムを作成するときに、実行時に引数を渡して処理したい時がありますよね?
コンソールを使って実行させるなら、引数を直接指定できますが…。
もしIDEを使っているなら、そのままでは引数を指定することができません。
IDEでプログラムを実行する時に引数を渡すためには、あらかじめ設定をしておく必要があります。

そこで、今回の記事では、NetBeansコマンドライン引数複数指定してプログラムを実行する方法について書いてみます。
ついでに、受け取ったコマンドライン引数の簡単な扱い方についても解説します。

コンソール上でコマンドライン引数を指定する方法

仮に、コマンドライン引数を受け取るプログラムを「CommandLine.java」とします。
コンパイルするときには「javac」を使いますね。
コンパイルが終了すると、「CommandLine.class」ファイルが作成されます。

javac CommandLine.java

このプログラムを実行するときにコマンドライン引数を渡すには…。
「java」コマンドに続いてプログラム名を指定した後に、スペース区切りで与えたい文字列を入力します。

例えば、「Hello」と「World」をコマンドライン引数に渡したい場合は以下のようにします。

java CommandLine.class Hello World

ちなみに、「Hello World」というスペースが入った文字列を指定したい場合には、その文字列をダブルクォーテーションで囲みます。
つまり、以下のように指定します。

java CommandLine.class "Hello World"

NetBeansでコマンドライン引数を指定する方法

NetBeansでコマンドライン引数を指定するには…。
まず、「デフォルト構成」と表示されている部分をクリックします。
すると、「カスタマイズ」という項目が表示されますので、それをクリックしてください。

NetBeans - カスタマイズ

プロジェクト・プロパティ画面が表示されます。
「メイン・クラス」に、実行したいプログラムが指定されているのを確認します。
そして、「引数」に、与えたいコマンドライン引数をスペース区切りで入力してください。
その後「OK」をクリックすれば、設定は完了です。

NetBeans - プロジェクト・プロパティ

プログラムの実行は、▶ボタンをクリックするかF6ボタンを押します。
これで、プログラムがコマンドライン引数を与えられた状態で実行されます。

コマンドライン引数の受け取り方

コマンドライン引数は、mainメソッドの引数であるargsの中に格納されています。
argsは配列になっていて、0番目に最初の引数、1番目に次の引数…というように順番に入っています。
引数の数は「args.length」で分かります。

サンプルプログラム

このサンプルプログラム(Args.java)は、入力されたコマンドライン引数の内容を全て表示するというものです。
for文でループしながら、argsの内容をSystem.out.printf()メソッドで表示させています。

package jp.suzushin7.sample;

public class Args {
    public static void main(String[] args) {
        for(int i = 0; i < args.length; i++) {
            System.out.printf("args[%d]: %s%n", i, args[i]);
        }
    }
}

実行結果

上記サンプルプログラムの実行結果の例は以下のようになります。
コマンドライン引数に「Hello World 1 2 3 4 5」を与えた場合には、このような結果になります。

args[0]: Hello
args[1]: World
args[2]: 1
args[3]: 2
args[4]: 3
args[5]: 4
args[6]: 5

ひとこと

今回の記事では、NetBeansでコマンドライン引数を指定してプログラムを実行する方法について書いてみました。
実際やってみると分かりますが、引数に指定するだけですので難しいということはないですよね。

「コマンドライン引数は、プロジェクト・プロパティ画面から指定する。」
「プログラム上では、受け取ったコマンドライン引数はargsに格納されている。」
以上の事を覚えておけば問題無いです。

コマンドライン引数を使う事で、プログラムの処理を柔軟に切り替えることができますので…。
ぜひあなたもコマンドライン引数を使ったプログラムを作成してみてくださいね。

Java カレントディレクトリを取得するサンプルプログラム

Java - カレントディレクトリ

こんにちは、すずしんです。

Javaでプログラミングをしている時に…。
カレントディレクトリ取得したいという事が時々あると思います。
ファイルを参照するときなどに、カレントディレクトリを利用しますよね。

そこで、今回の記事では、Javaでカレントディレクトリを取得する方法についてまとめておきます。
やり方が一度分かってしまえば簡単ですよ。

カレントディレクトリの取得方法

Javaでカレントディレクトリを取得する方法は主に2つあります。
現在位置の絶対パスから取得する方法」と「System.getProperty()で取得する方法」ですね。
それぞれの方法について、簡単に解説していきます。

現在位置の絶対パスから取得する方法

まずは、現在位置の絶対パスから取得する方法についてです。

この方法では、まず現在位置のFileを作成します。
そして、そのFileの絶対パスをgetAbsoluteFile()で取得します。
最後に、この絶対パスの親ディレクトリをgetParent()で取得します。
このディレクトリがカレントディレクトリとなります。

この方法を使って、カレントディレクトリを取得するサンプルプログラムは以下のようになります。

package jp.suzushin7.sample;

import java.io.File;

public class CurrentDirectory {
    public static void main(String[] args) {
        String cd = new File(".").getAbsoluteFile().getParent();
        System.out.println(cd);
    }
}

System.getProperty()で取得する方法

続いて、System.getProperty()で取得する方法についてです。

こちらの場合は、System.getProperty()で与えるkeyに「user.dir」を指定するだけです。
これで取得できる値がカレントディレクトリとなっています。

この方法を使って、カレントディレクトリを取得するサンプルプログラムは以下のようになります。

package jp.suzushin7.sample;

public class CurrentDirectory {
    public static void main(String[] args) {
        String cd = System.getProperty("user.dir");
        System.out.println(cd);
    }
}

ひとこと

今回の記事では、Javaでカレントディレクトリを取得する方法について書いてみました。
2通りのやり方がありますが…。
個人的には、何となく前者の方法が好きですかね?

ファイルを参照するときなどに、カレントディレクトリを取得したくなったら…。
ぜひこの記事の方法を参考にしてくださいね。

Java 指定したURLの存在を確認するサンプルプログラム

Java

こんばんは、すずしんです。

今回の記事では、Java言語のプログラミングをしてみます。
テーマとしては「指定したURL存在確認する」というものです。

指定したURLの存在を確認する方法

指定したURLの存在を確認するには、HttpURLConnectionクラスを使います。
試しに対象のURLに接続してみて、そのレスポンスコードがHTTP_OK(200)になるかどうかを確認します。
HTTP_OKならURLが存在しているということですね。

この考え方をもとにして、指定したURLの存在を確認するメソッドisExistURL()を作成してみました。
それが以下のようなコードです。
urlStringで表されるURLが存在すればtrue、存在しなければfalseを返します。

private static boolean isExistURL(String urlString) {
    URL url;
    int response = 0;
        
    try {
        url = new URL(urlString);
        HttpURLConnection connection = (HttpURLConnection)url.openConnection();
        connection.setRequestMethod("HEAD");
        connection.connect();
        response = connection.getResponseCode();
        connection.disconnect();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
        
    return response == HttpURLConnection.HTTP_OK;
}

サンプルプログラム

このisExistURL()の動作確認用に、サンプルプログラムURLCheckerを作成してみました。
URL_STRINGSに記述したそれぞれのURLに対してisExistURL()を実行して、その結果をコンソールに出力します。

package jp.suzushin7.sample;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class URLChecker {
    private static final String[] URL_STRINGS = {
        "http://www.suzushin7.jp/", "http://www.suzushin7.jp/sample/", "https://www.google.co.jp/"
    };
    
    public static void main(String[] args) {
        for(String u: URL_STRINGS) {
            System.out.println(u + " : " + isExistURL(u));
        }
    }
    
    private static boolean isExistURL(String urlString) {
        URL url;
        int response = 0;
        
        try {
            url = new URL(urlString);
            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            connection.setRequestMethod("HEAD");
            connection.connect();
            response = connection.getResponseCode();
            connection.disconnect();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        return response == HttpURLConnection.HTTP_OK;
    }
}

実行結果

上記サンプルプログラムを実行した結果は以下のようになります。
確かに、存在しているURLはtrue、存在していないURLはfalseとなっているのが分かりますね。

http://www.suzushin7.jp/ : true
http://www.suzushin7.jp/sample/ : false
https://www.google.co.jp/ : true

ひとこと

今回の記事では、指定したURLが存在するかどうかを確認するサンプルプログラムを作成してみました。
一度原理が分かれば、割とスムーズに作成することができますね。

isExistURL()を使う事で、リンク切れの確認ができるようになります。
これを応用して、リンク切れ確認ツールのようなプログラムを今後作成してみたいですね。

Java XMLをDOMで読み込んで内容を取得するサンプルプログラム

Java

こんにちは、すずしんです。

XMLは、データをシンプルに扱うためのデータ構造です。
非常に使い勝手が良く、Webなどの世界ではよく利用されます。

そのXMLを、Javaで扱う方法について今回は書いてみようと思います。
具体的には、XMLをDOMで読み込んで内容を取得する方法を扱います。

DOMとは?

DOMというのは、XMLを扱うためのAPI仕様の事をいいます。
この仕様では、XMLによって書かれた文書全体をドキュメントと呼びます。
ドキュメントはノードから構成されるノードツリーとなっています。

ドキュメントの取得方法(Java)

Javaでドキュメントを取得するには、主に3つのステップがあります。

ステップ1: DocumentBuilderFactoryクラスのnewInstance()メソッドを使用します。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

ステップ2: DocumentBuiderFactoryのインスタンスからnewDocumentBuilder()メソッドを呼び出します。

DocumentBuilder builder = factory.newDocumentBuilder();

ステップ3: DocumentBuilderのインスタンスからparse()メソッドを呼び出します。

Document document = builder.parse("sample.xml");

ドキュメントの操作方法

ドキュメントを操作するには、まずgetDocumentElement()メソッドでElementノードを取得します。
このElementノードに対して操作メソッドを使います。

Element root = document.getDocumentElement();

その後は、NodeやElementに対する操作が多くなりますが…。
これらで使用できるメソッド群についての詳細はAPIを参照してください。

Node (Java Platform SE 7 )
Element (Java Platform SE 7 )

今回の例で使用するのは、主に以下のメソッドです。

Node
String getNodeName(): ノード名を取得。
NodeList getChildNodes(): このノードの子をすべて含むNodeListを取得。

Element
String getAttribute(String name): 属性を取得。

NodeList
int getLength(): リスト内のノード数を取得。
Node item(int index): リスト内のindex番目の項目を取得。

DOMでXMLを扱うサンプルプログラム

このサンプルで扱うXMLは以下のようになっています。
友達リストのような形です。
これをpersons.xmlとして保存してあります。

<?xml version="1.0" encoding="utf-8" ?>
<persons name="friends">
  <person name="Asakura">
    <gender>Male</gender>
    <age>20</age>
    <interest>Game</interest>
  </person>
  <person name="Kikuchi">
    <gender>Male</gender>
    <age>23</age>
    <interest>Tennis</interest>
  </person>
  <person name="Suzuki">
    <gender>Female</gender>
    <age>19</age>
    <interest>Baseball</interest>
  </person>
</persons>

persons.xmlの内容を取得して、コンソールに取得するサンプルプログラムは以下のようになります。
ここではXMLReaderクラスとしてみました。

package jp.suzushin7.sample;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XMLReader {
    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse("persons.xml");
        
        Element root = document.getDocumentElement();
        
        System.out.println("Node: " + root.getNodeName());
        System.out.println("name: " + root.getAttribute("name"));
        
        System.out.println("==============================");
        
        NodeList personsNodeList = root.getChildNodes();
        for(int i = 0; i < personsNodeList.getLength(); i++) {
            Node personNode = personsNodeList.item(i);
            if(personNode.getNodeType() == Node.ELEMENT_NODE) {
                Element personElement = (Element)personNode;
                if(personElement.getNodeName().equals("person")) {
                    System.out.println("[" + personElement.getAttribute("name") + "]");
                    NodeList personChildrenNodeList = personElement.getChildNodes();
                    for(int j = 0; j < personChildrenNodeList.getLength(); j++) {
                        Node node = personChildrenNodeList.item(j);
                        if(node.getNodeType() == Node.ELEMENT_NODE) {
                            System.out.println(node.getNodeName() + ": " + node.getTextContent());
                        }
                    }
                }
            }
        }
        
        System.out.println("==============================");
    }
}

実行結果

上記サンプルプログラムを実行すると、以下のような結果が得られます。
確かに、persons.xmlの内容が正しく取得できているのが分かりますね。

Node: persons
name: friends
==============================
[Asakura]
gender: Male
age: 20
interest: Game
[Kikuchi]
gender: Male
age: 23
interest: Tennis
[Suzuki]
gender: Female
age: 19
interest: Baseball
==============================

ひとこと

今回の記事では、JavaでDOMを使ってXMLを扱う方法について書いてみました。
やり方が分かってしまえば、それほど難しいというわけでもなさそうですね。

今回のサンプルプログラムは、XMLの内容を表示するだけの非常にシンプルなものでしたが…。
XMLを扱えるようになると、もっと色々な応用ができると思います。
ぜひ工夫して便利なプログラムを作成してみてくださいね。

Java String 文字列がnullまたは空文字列かどうかの確認方法(isEmpty)

Java - isEmptyメソッド

こんにちは、すずしんです。

Javaでプログラミングをしていると、文字列の処理をすることがあると思いますが…。
特に、「文字列がnullまたは空文字列かどうか」を確認することが多いのではないでしょうか?
主に入力チェックをした時によく利用しますね。

そこで、今回の記事では…。
文字列がnullまたは空文字列かどうかを確認する方法について書いてみます。

isEmptyメソッド

ここでは、文字列がnullまたは空文字列かどうかの結果を返すメソッドを定義します。
メソッド名はisEmptyとしてみました。

このisEmptyメソッドの実装例としては以下のような感じです。
まさに条件をそのままプログラムにしてありますね。

package jp.suzushin7.sample;

public class StringUtils {
    public static boolean isEmpty(String value) {
        if(value == null || value.length() == 0)
            return true;
        else
            return false;
    }
}

サンプルプログラム

上記のisEmptyメソッドを使ったサンプルプログラムの例は以下のような感じです。
mainメソッドでは、まずvalue1にnull、value2に空文字列、value3には"Sample"という文字列を代入したインスタンスを用意しておきます。
そして、それぞれのインスタンスに対してisEmptyを実行して、その結果を出力しています。

package jp.suzushin7.sample;

public class IsEmptyTest {
    public static void main(String[] args) {
        String value1 = null;
        String value2 = "";
        String value3 = "Sample";

        System.out.println(StringUtils.isEmpty(value1));
        System.out.println(StringUtils.isEmpty(value2));
        System.out.println(StringUtils.isEmpty(value3));
    }
}

サンプルプログラムの実行結果

上記サンプルプログラムの実行結果は以下のようになります。
文字列がnullまたは空文字列の時(value1とvalue2)は、結果がtrueになっています。
そして、それ以外の文字列の時(value3)には、結果はfalseとなっていますね。

true
true
false

ひとこと

文字列がnullまたは空文字列かどうかを確認する機会というのは結構あるかもしれません。
その時に備えて予めisEmptyメソッドを準備しておくと、ちょっと幸せになるのではないでしょうか。

Java 整数配列をバブルソートするプログラムを作成してみた

Java - バブルソート

こんにちは、すずしんです。

しばらく私はプログラミングをしていませんでしたので…。
久しぶりに、簡単なプログラムを書いてみました。

今回作成したプログラムというのは、「整数配列をバブルソートで整列する」というものです。
具体的には、ランダムな数字の整数配列を昇順に並び替えるプログラムとなっています。
ちなみに、使用したプログラミング言語はJavaです。

プログラムの難易度としては、かなり簡単な部類になると思いますが…。
久しぶりに書くのでリハビリにはちょうど良いかなと。

バブルソートとは?

バブルソートというのは、リスト(配列)に対して、隣り合う二つの要素の値を比較して条件に応じた交換を行う整列アルゴリズムです。
ここで、条件というのは要素の大小関係の事をいいます。
値の大きい順(降順)または小さい順(昇順)で並び替えます。
このソートを行うと、値の大きいまたは小さい要素が浮かびあがってくるように見えるので、バブル(泡)ソートと呼ばれます。

バブルソートの例

ここでは、以下のような配列の昇順でのバブルソートの例を挙げてみます。

1回目で最も小さい値の1が左端へ順に移動していきます。
続いて、2回目で次に小さい値の3が左へ移動していきます。
同様に3回目、4回目と同じ操作をしていくと、最終的に昇順に整列されます。

7,9,5,1,3 - スタート時
7,9,1,5,3
7,1,9,5,3
1,7,9,5,3 - 1回目終了時
1,7,9,3,5
1,7,3,9,5
1,3,7,9,5 - 2回目終了時
1,3,7,5,9
1,3,5,7,9 - 3回目終了時
1,3,5,7,9 - 4回目終了時

バブルソートのサンプルプログラム

整数配列のバブルソートを行うサンプルプログラムを書いてみました。
ここでは、10個の要素を持つ整数配列を昇順に並び替えています。

mainメソッドでは、まず乱数を扱うためにRandomクラスのインスタンスrを用意します。
そして、int型配列を生成した後、forループ中で乱数を代入していきます。
printArrayメソッドで整列前の配列の中身を表示してから、bubbleSortメソッドでソートし、再びprintArrayメソッドで整列後の配列の中身を表示しています。

package jp.suzushin7.sample;

import java.util.Random;

public class BubbleSort {
    public static void main(String[] args) {
        Random r = new Random();

        int[] n = new int[10];
        for(int i = 0; i < n.length; i++) {
            n[i] = r.nextInt(100);
        }

        printArray(n);
        bubbleSort(n);
        printArray(n);
    }

    private static void bubbleSort(int[] n) {
        int tmp;
        for(int i = 0; i < n.length - 1; i++) {
            for(int j = n.length - 1; i < j; j--) {
                if(n[j-1] > n[j]) {
                    tmp = n[j-1];
                    n[j-1] = n[j];
                    n[j] = tmp;
                }
            }
        }
    }

    private static void printArray(int[] n) {
        for(int i = 0; i < n.length; i++) {
            if(i == n.length - 1) {
                System.out.println(n[i]);
            } else {
                System.out.print(n[i]+",");
            }
        }
    }
}

バブルソートのサンプルプログラムの実行結果

上記サンプルプログラムの実行結果の例を載せておきます。

ソート前の配列は、ランダムな数字が並んでいます。
そして、ソートされた後の配列は綺麗に昇順になっています。

乱数を使っていますので、実行するたびに数字が変わりますが…。
全てのパターンで正しく昇順にソートされるのが分かります。

93,88,96,74,76,32,46,90,37,54
32,37,46,54,74,76,88,90,93,96

ひとこと

今回は、バブルソートのプログラムを作成してみましたが…。
実際やってみると、意外と簡単にプログラムが組めてしまうというのが分かりましたね。
パパっとできましたよっ!

実装の難易度はとても低いですので…。
プログラミングを学び始めた方にとって、バブルソートを実装してみるというのは非常に良い練習になるのではないでしょうか。

ドットインストールでPHP入門のプログラミング学習をしてみた!

ドットインストール

こんにちは、すずしんです。

ここ最近は、あまりプログラミング関連の勉強をしていませんでしたので…。
何かしないとと思いまして、今回はPHPの学習をしてみることにしました。

参考書を読んで勉強するという手もありますが…。
動画で解説してもらった方が分かりやすいかもという事で、ドットインストールを利用してみました。
今回は「PHP入門」をやってみましたよ。

ドットインストールとは?

ドットインストールというのは、簡単に言ってしまうと、3分ほどの動画を視聴しながらプログラミングの学習をする初心者向けのサイトです。

各レッスンは何回かの項目に分かれていますが…。
それぞれの項目は、およそ3分ほどの動画でまとめられています。

例えば、今回のPHP入門であれば全30回ありますので…。
全部でおよそ90分の動画で学習できるという事ですね。

レッスンの内容としては、PHPの他にもHTML/CSS/JavaScript/Ruby/WordPress/Swiftなど多岐にわたります。
無料の範囲でも、かなりの学習をすることができますが…。
プレミアム会員になると、より高度な内容の学習をすることが可能になります。

PHP入門

ドットインストールのPHP入門では、まず初めてのプログラムから始まります。
そして、PHPの言語仕様について、実際にコードを書きながら進んでいきます。
その都度解説が入りますので、非常に分かりやすいと思いますよ。

全30回のレッスンとなっていますので、一見時間がかかって大変そうに思うかもしれませんが…。
体感としてはそれほどでもなく、あっという間のような気がしますよ。

ドットインストールを使うと、PHP入門なら90分ほどでざっくりとPHPの学習ができます。
基本的な学習をするのならちょうど良いのではないでしょうか。

私は過去にPHPの学習をしていましたが…。
だいぶ前の事だったので忘れてしまっていました。
ただ、このPHP入門の動画を観ることで、改めてこんな感じだったなと思い出すことができました。

ひとこと

ドットインストールを利用すると、プログラミングの基本について動画で学習することができます。
1回分の動画は3分ほどですので、集中して視聴することができますね。

今回はPHP入門の学習に利用してみましたが…。
他の言語の学習にももちろん使えますので…。
私は積極的に利用していきたいと思っていますよ。

プログラミングに興味はあるけど、独学ではなかなか学習が続かないということがあると思います。
そんな時は、このドットインストールのようなサイトを利用してみるのも良いのではないでしょうか?

Ruby入門 第2回 数値の表現・四則演算および変数

Ruby

こんにちは、すずしんです。

前回に引き続き、Rubyの学習を進めてみました。
今回学習したのは、Rubyにおける数値の表現と四則演算および変数についてです。

数値の表現と表示

Rubyで数値を表現するには、単に数字を並べて書けば良いです。

100
3.14

数値を表示するには、文字列と同様にprintメソッドやputsメソッドを使います。

puts(100)
puts(3.14)

四則演算

当然ながら、数値の四則演算を行う事が可能です。
加算は「+」、減算は「-」、乗算は「*」、除算は「/」、剰余は「%」を使います。

puts(7 + 3) # 加算
puts(7 - 3) # 減算
puts(7 * 3) # 乗算
puts(7 / 3) # 除算
puts(7 % 3) # 剰余
10
4
21
2
1

変数

変数というのは、簡単に言うと値を保持しておく箱のようなものです。
変数に値を入れることを「代入」すると言います。
変数名は、基本的に分かりやすい名前を付けるようにします。

message = "Hello, Ruby!"
value = 10.5
age = 25
name = "Suzuki"

変数の利用例として、直方体の表面積と体積を求めるプログラムを見てみます。

x = 5
y = 10
z = 20
area = 2 * (x * y + y * z + z * x)
volume = x * y * z
print("表面積: ", area, "\n")
print("体積: ", volume, "\n")
表面積: 700
体積: 1000

ひとこと

今回は、Rubyの主に四則演算と変数について学習してみました。
特に難しい事は無いです。
パパッと確認する程度でしたよ。
この調子でどんどんと学習を進めていきたいですね。

Ruby入門 第1回 最初のRubyプログラム(HelloWorld)

Ruby

こんにちは、すずしんです。

最近、私はRubyのプログラミングに興味を持ち始めました。
そこで、まずはRubyの基本文法について学習することにしました。
ここでは、基本となる最初のRubyプログラム(HelloWorld)について調べました。

最初のRubyプログラム

Rubyの最初のプログラムは以下のような感じになります。
いわゆるHelloWorldです。
これを「hello.rb」として保存しておきます。

print("Hello, World!\n")

Rubyプログラムの実行方法

コマンドプロンプトやターミナルを起動します。
そして、hello.rbがあるディレクトリまで移動します。
その後、rubyコマンドでhello.rbを指定して実行します。

ruby hello.rb
Hello, World!

プログラムの解説

最初のRubyプログラムについて簡単に解説します。

オブジェクト

"Hello, World!\n"という部分は、Stringオブジェクト(文字列オブジェクト・文字列)と呼びます。
「Hello, World!\n」という文字列を表すオブジェクトという意味になります。
Rubyでは、文字列・数値・時刻などといった様々なデータがオブジェクトになります。

メソッド

今度は「print」に注目してみます。
この「print」というのはメソッドです。
メソッドというのは、オブジェクトを操作する手続きの事を言います。
また、メソッドに渡す値のことを引数と言います。

printメソッドは、引数として与えられた文字列の内容をコンソールに出力するメソッドです。
そのため、hello.rbで書いたプログラムでは、「Hello, World!」という文字列が表示されます。

文字列

文字列オブジェクトを作成するための区切り文字には、ダブルクォート("")の他、シングルクォート('')も使う事ができます。
シングルクォートで文字列を囲った場合、「\n」などの特殊文字の解釈をせず、そのまま出力します。

print('Hello,\nRuby!\n')
Hello,\nRuby!\n

putsメソッド

putsメソッドは、表示する文字列の最後で改行を行います。
ですので、最初のプログラムは以下のように書くこともできます。
状況に応じてprintメソッドと使い分けると良いです。

puts("Hello, World!")

pメソッド

pメソッドは、オブジェクトの内容を表示するときに便利なメソッドです。
引数の型によって、表示方法が変わります。
ハッシュや配列の内容などを表示するときに使うと良いです。

puts("1") # 1
puts(1)   # 1
p "1"     # "1"
p 1       # 1

ひとこと

今回の記事では、Rubyの最初のプログラムであるHelloWorldについて学習してみました。
Rubyでは、わずか1行で文字列が表示できてしまうのです!
非常に簡単ですね。

今後は、よく使われる基本的な文法について学んでいきたいと思います。
できるだけ早い時期に、Rubyで色々なプログラムが書けるようになりたいですね。