学生向けプログラミング入門 | 無料

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

Java | 18 | 表

↓↓クリックして頂けると励みになります。



17 | 二次元配列】 << 【ホーム】 >> 【19 | 表の改良

表を作成するプログラム
表を作成するプログラム



表を表示させるプログラムを作成し、Javaプログラミングの理解を深めます。




Visual Studio Codeで以下の「Hyou.java」ファイルを作成して下さい。


新規作成 【Hyou.java】

public class Hyou {

	public static void main( String[] argv ) {

		String[][] data = {
				{ "1", "2", "3", "4", "5", "6" },
				{ "apple", "banana", "orange", "peach", "tomato", "melon" }, 
				{ "100", "50", "70", "200", "80", "400" } 
				};

		drawTable( data );
	}

	public static void drawTable( String[][] data ) {

		for( int i=0; i<data.length; i++ ) {
			for( int j=0; j<data[0].length; j++ ) {
				System.out.print( "|" + data[i][j] + '\t' );
			}
			System.out.println( "|" );
		}
	}
}



二次元配列を使用しています。
'\t'を使って"|"の位置を揃えています。


このプログラムの欠点は、dataに与える文字列の文字数が多いとうまく"|"が揃わないところにあります。


作成したJavaプログラムをコンパイルして実行結果を確認します。

~/Desktop/Programming/JP $ javac Hyou.java 

~/Desktop/Programming/JP $ java Hyou
      
|1      |2      |3      |4      |5      |6      |
|apple  |banana |orange |peach  |tomato |melon  |
|100    |50     |70     |200    |80     |400    |



Visual Studio Codeで以下の「Hyou2.java」ファイルを作成して下さい。


【Hyou2.java】

public class Hyou2 {
 
    public static void main( String[] argv ) {

        String[][] data = {
            { "1", "2", "3", "4", "5", "6" },
            { "apple", "banana", "orange", "peach", "strawberry", "melon" },
            { "100", "50", "70", "200", "10", "400" }
        };
        drawTable( data );
    }
 
    public static void drawTable( String[][] data ) {

        int max = maxWidth( data );
 
        for( int i=0; i<data.length; i++ ) {
            for( int j=0; j<data[0].length; j++ ) {
                    System.out.print( "|" + data[i][j] );

                for( int k=data[i][j].length(); k<max; k++ ) {
                    System.out.print( " " );
                }
            }
            System.out.println( "|" );
        }
    }

    private static int maxWidth( String[][] data ) {

        int max = 0;
        
        for( int i=0; i<data.length; i++ ) {
            for( int j=0; j<data[0].length; j++ ) {

                if( data[i][j].length() > max ) {
                    max = data[i][j].length();
                }
            }
        }
        return max;
    }
}



最大文字数にあわせてスペースを入れて表を表示するプログラムです。
表の大きさが一定になります。
文字数が多くなっても列が合わなくなることはありません。


maxWidth( )メソッドを見てください。

int max = 0;

 for( int i=0; i<data.length; i++ ) {
    for( int j=0; j<data[0].length; j++ ) {

        if( data[i][j].length() > max ) {
            max = data[i][j].length();
        }
    }
}



data[0].lengthという記述がありますが、これはdata[0]の大きさを示します。
ここでのdata[0]とは、{ "1", "2", "3", "4", "5", "6" }を示しますので、data[0].length = 6となります。


data[i][j].length()という記述もあります。
この ij には0〜5の数字が入ります(このメソッドに限ります)。
例えば、data[1][4].lengthなら、strawberryの文字数なので、10になります。


単にdata.lengthとすると、文字列の固まりの数、今回は3になります。


drawTable()メソッドでは文字列の最大数分スペースを表示させています。


このプログラムの欠点は必ず左寄せになってしまうことです。


Javaプログラム「Hyou2.java」をコンパイルして実行結果を確認します。

~/Desktop/Programming/JP $ javac Hyou2.java

~/Desktop/Programming/JP $ java Hyou2
      
|1         |2         |3         |4         |5         |6         |
|apple     |banana    |orange    |peach     |strawberry|melon     |
|100       |50        |70        |200       |10        |400       |



Visual Studio Codeで以下の「Hyou3.java」ファイルを作成して下さい。


新規作成 【Hyou3.java】

public class Hyou3 {
  
    public static void main( String[] argv ) {

        String[][] data = {
            { "1", "2", "3", "4", "5", "6" },
            { "apple", "banana", "orange", "peach", "strawberry", "melon" },
            { "100", "50", "70", "200", "10", "400" }
        };

        drawTable( data );
    }

    public static void drawTable( String[][] data ) {

        int[] max = maxWidth( data );

        for( int i=0; i<data.length; i++ ) {
            for( int j=0; j<data[0].length; j++ ) {
                System.out.print( "|" + data[i][j] );

                for( int k=data[i][j].length() +1; k<=max[j]; k++ ) {
                    System.out.print( " " );
                }
            }
            System.out.println( "|" );
        }
    }

    private static int[] maxWidth( String[][] data ) {

        int[] max = new int[ data[0].length ];

        for( int j=0; j<data[0].length; j++ ) {
            max[j] = 0;

            for( int i=0; i<data.length; i++ ) {

                if( data[i][j].length() > max[j] ) {
                    max[j] = data[i][j].length();
                }
            }
        }
        return max;
    }
}



maxWidth()メソッドを見てください。
この部分が今までのプログラムと違うところです。


int[] max = new int[ data[0].length ];
この記述は、用意するmaxを配列にします。


各列ごとの文字数を調べ、maxに格納しています。


それを受けたdrawTable()メソッドは各列ごとの最大文字数に対してスペースの数を決めています。
列の大きさは文字数の大きさによって違ってきます。


作成したJavaプログラムをコンパイルして実行結果を確認します。

~/Desktop/Programming/JP $ javac Hyou3.java

~/Desktop/Programming/JP $ java Hyou3
      
|1    |2     |3     |4    |5         |6    |
|apple|banana|orange|peach|strawberry|melon|
|100  |50    |70    |200  |10        |400  |



Visual Studio Codeで以下の「Hyou4.java」ファイルを作成して下さい。


新規作成 【Hyou4.java】

public class Hyou4 {
   
    public static void main( String[] argv ) {

        String[][] data = {
            { "1", "2", "3", "4", "5", "6" },
            { "田中", "木村", "佐藤", "鈴木", "高橋", "斉藤" },
            { "太郎", "二郎", "三郎", "四郎", "五郎","六郎" }, 
            { "tanaka","kimura", "satou", "suzuki", "takahashi","saitou" }
        };
        drawTable( data );
    }

    public static void drawTable( String[][] data ) {

        int[] max = maxWidth( data );

        for( int i=0; i<data.length; i++ ) {
            for( int j=0; j<data[0].length; j++ ) {
                System.out.print( "|" + data[i][j] );

                //文字カウントを取得
                int count = count( data[i][j] );

                //文字カウントと最大カウントを比べてその差分だけ半角スペースを入れる。
                for( int k=count; k<=max[j]; k++ ) {
                    System.out.print( " " );
                }
            }
            System.out.println( "|" );
        }
    }

    private static int[] maxWidth( String[][] data ) {

        int[] max = new int[ data[0].length ];

        for( int j=0; j<data[0].length; j++ ) {
            max[j] = 0;
            for( int i=0; i<data.length; i++ ) {
                int count = count( data[i][j] );
                if( count > max[j] ) {
                    max[j] = count+1;
                }
            }
        }
        return max;
    }

    public static int count( String str ) {
        int count = 0;
        char[] a = str.toCharArray();
        for( int i=0; i<str.length(); i++ ) {
            if( Character.UnicodeBlock.of( a[i] ).equals( Character.UnicodeBlock.BASIC_LATIN ) ) {
                count++;
            }
            else { 
                count+=2;
            }
        }
        return count;
    }
}



日本語の表示を認識してスペースの数を決めるプログラムです。
日本語1文字を半角スペース2つとして数えています。


count()メソッドを見てください。
これは文字の種類によって文字の大きさをカウントしていくメソッドです。

char[] a = str.toCharArray();

この文は、与えられたString型の文字列strを、1文字ずつに分けてchar型の配列 a に格納しています。

if( Character.UnicodeBlock.of( a[i] ).equals
    ( Character.UnicodeBlock.BASIC_LATIN ) ) {
    count++;
}
else { 
    count+=2;
}

1文字ずつに分けられた文字は、それが英数字なのかどうか判別されます。

Character.UnicodeBlock.of( a[i] ).equals( Character.UnicodeBlock.BASIC_LATIN )

その記述がこれです。
これはjavaのパッケージを利用しています。
「BASIC_LATIN」は英数字を表しています。
もし漢字を認識したい時は「CJK_UNIFIED_IDEOGRAPHS」とすれば出来ます。


その文字が英数字なら1つカウントし、それ以外なら(日本語なら)2つカウントするようにしています。
このカウントをもとに、各列ごとの最大文字数に対応するスペース数を決めています。


作成したJavaプログラムをコンパイルして実行結果を確認します。

~/Desktop/Programming/JP $ javac Hyou4.java

~/Desktop/Programming/JP $ java Hyou4
      
|1       |2       |3     |4       |5          |6       |
|田中    |木村    |佐藤  |鈴木    |高橋       |斉藤    |
|太郎    |二郎    |三郎  |四郎    |五郎       |六郎    |
|tanaka  |kimura  |satou |suzuki  |takahashi  |saitou  |



Visual Studio Codeで以下の「Hyou5.java」ファイルを作成して下さい。


新規作成 【Hyou5.java】

public class Hyou5 {
    
    public static void main( String[] argv ) {

        String[][] data = {
            { "1", "2", "3", "4", "5", "6" },
            { "たなか", "きむら", "サトウ", "スズキ", "高橋", "さいとう" },
            { "太郎", "二郎", "三郎", "四郎", "五郎","六郎" }, 
            { "tanaka","kimura", "satou", "suzuki", "takahashi","saitou" }
        };               
        drawTable( data );
    }

    public static void drawTable( String[][] data ) {

        int[] max = maxWidth( data );

        for( int i=0; i<data.length; i++ ) {
            for( int j=0; j<data[0].length; j++ ) {
                System.out.print( "|" + data[i][j] );

                int count = count( data[i][j] );

                for( int k=count; k<=max[j]; k++ ) {
                        System.out.print( " " );
                }
            }
            System.out.println( "|" );
        }
    }

    private static int[] maxWidth( String[][] data ) {
        int[] max = new int[ data[0].length ];
        for( int j=0; j<data[0].length; j++ ) {
            max[j] = 0;
            for( int i=0; i<data.length; i++ ) {
                int count = count( data[i][j] );
                    if( count > max[j] ) {
                        max[j] = count;
                }
            }
        }
        return max;
    }

    public static int count( String str ) {
        int count = 0;
        char[] a = str.toCharArray();
        for( int i=0; i<str.length(); i++ ) {
            if( Character.UnicodeBlock.of( a[i] ).equals
                    ( Character.UnicodeBlock.BASIC_LATIN ) ) {
                    count++;
            }
            else if( Character.UnicodeBlock.of( a[i] ).equals
                ( Character.UnicodeBlock.KATAKANA ) ) {
                count+=2;
            }
            else if( Character.UnicodeBlock.of( a[i] ).equals
                ( Character.UnicodeBlock.HIRAGANA ) ) {
                count+=2;
            }
            else if( Character.UnicodeBlock.of( a[i] ).equals
                ( Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS) ) {
                count+=2;
            }
        }
        return count;
    }
}



ひらがな、カタカナ、漢字の文字コードを分類するプログラムです。


前のプログラムの英数字に加えて、次のパッケージを付け加えました。


カタカナを判別するパッケージ
Character.UnicodeBlock.of( a[i] ).equals( Character.UnicodeBlock.KATAKANA )


ひらがなを判別するパッケージ
Character.UnicodeBlock.of( a[i] ).equals( Character.UnicodeBlock.HIRAGANA )


漢字を判別するパッケージ
Character.UnicodeBlock.of(a[i]).equals(Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS)


コンパイルして実行結果を確認して下さい。

~/Desktop/Programming/JP $ javac Hyou5.java

~/Desktop/Programming/JP $ java Hyou5      
|1      |2      |3      |4      |5         |6        |
|たなか |きむら |サトウ |スズキ |高橋      |さいとう |
|太郎   |二郎   |三郎   |四郎   |五郎      |六郎     |
|tanaka |kimura |satou  |suzuki |takahashi |saitou   |



Visual Studio Codeで以下の「Hyou6.java」ファイルを作成して下さい。


新規作成 【Hyou6.java】

public class Hyou6 {
    
    public static void main( String[] argv ) {

        String[][] data = {
            { "1", "2", "3", "4", "5", "6" },
            { "田中", "木村", "佐藤", "鈴木", "高橋", "斉藤" },
            { "太郎", "二郎", "三郎", "四郎", "五郎","六郎" }, 
            { "tanaka","kimura", "satou", "suzuki", "takahashi","saitou" }
        };

        drawTable( data );
    }

    public static void drawTable( String[][] data ) {

        int[] max = maxWidth( data );

        for( int i=0; i<data.length; i++ ) {
            drawLine( data[i], max );
        }
    }

    private static void drawLine( String[] line, int[] max ) {

        for( int j=0; j < line.length; j++ ) {
            System.out.print( "|" + line[j] );

            for( int k=count( line[j] ); k<=max[j]; k++ ) {
                System.out.print( " " );
            }
        }
        System.out.println( "|" );
    }

    private static int[] maxWidth( String[][] data ) {

        int[] max = new int[ data[0].length ];

        for( int j=0; j<data[0].length; j++ ) {
            max[j] = 0;

            for( int i=0; i<data.length; i++ ) {

                int n = count( data[i][j] );

                if( n > max[j] ) {
                        max[j] = n;
                }
            }
        }
        return max;
    }

    public static int count( String str ) {

        int count = 0;
        char[] a = str.toCharArray();
        for( int i=0; i<str.length(); i++ ) {
            if( Character.UnicodeBlock.of( a[i] ).equals
                ( Character.UnicodeBlock.BASIC_LATIN ) ) {
                count++;
            }
            else {
                count+=2;
            }
        }
        return count;
    }
}



「Hyou4.java」とほとんど同じプログラムです。


drawTable()メソッドをもう一つ分離させて、drawLine()メソッドを作りました。


drawTableでは、縦方向の表示を管理し、drawLineは横方向の表示を管理するようにしました。


結果は「Hyou4.java」と同じです。
プログラムをコンパイルして実行結果を確認して下さい。

~/Desktop/Programming/JP $ javac Hyou6.java

~/Desktop/Programming/JP $ java Hyou6
      
|1      |2      |3     |4      |5         |6      |
|田中   |木村   |佐藤  |鈴木   |高橋      |斉藤   |
|太郎   |二郎   |三郎  |四郎   |五郎      |六郎   |
|tanaka |kimura |satou |suzuki |takahashi |saitou |



17 | 二次元配列】 << 【ホーム】 >> 【19 | 表の改良




↓↓クリックして頂けると励みになります。