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

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

Java | 19 | 表の改良

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



18 | 表】 << 【ホーム】 >> 【20 | StringBuffer


表示方法が選べる表のプログラム
表示方法が選べる表のプログラム



前のセクションで作成した表のプログラムを、表示方法が選べるように改良します。




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


新規作成 【Hyou7.java】

public class Hyou7 {

    public static final int LEFT = 0;
    public static final int RIGHT = 1;

    public static void main( String[] argv ) {

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

        drawTable( data, LEFT );
        drawTable( data, RIGHT );
    }
    
    public static void drawTable( String[][] data ) {

        int[] max = maxWidth( data );

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

    public static void drawTable( String[][] data, int flag ) {

        int[] max = maxWidth( data );

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

    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] )+1; k<=max[j]; k++ ) {
                System.out.print( " " );
            }
        }
        System.out.println( "|" );
    }

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

        if( flag == LEFT ) {                                                                                
            for( int j=0; j<line.length; j++ ) {
                System.out.print( "|" + line[j] );
                for( int k=count( line[j] )+1; k<=max[j]; k++ ) {
                    System.out.print( " " );
                }
            }                	
        }
        else if( flag == RIGHT ) {
		
            for( int j=0; j<line.length; j++ ) {
                System.out.print( "|" );

                for( int k=count( line[j] )+1; k<=max[j]; k++ ) {
                    System.out.print( " " );
                }
                System.out.print( line[j] );
            }
        }
        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 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;
    }
}



次の記述を見て下さい。

public static final int LEFT = 0;
 public static final int RIGHT = 1;



この記述は定数を宣言しています。
LEFTは左寄せの時のフラッグとして使います。
RIGHTは右寄せです。


drawTable()メソッドが2つあります。


もし2つの引数を使うときは今までになかったdrawTable( String[][] data, int flag )メソッドの方が呼ばれます。
配列とLEFTかRIGHTかのフラッグを引数として渡します。


drawLine()メソッドも2つあります。
フラッグを引数としてもらうメソッドdrawLine( String[] line, int[] max, int flag )を見てください。

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

    if( flag == LEFT ) {                                                                                
        for( int j=0; j<line.length; j++ ) {
            System.out.print( "|" + line[j] );
            for( int k=count( line[j] )+1; k<=max[j]; k++ ) {
                System.out.print( " " );
            }
        }
    }
    else if( flag == RIGHT ) {
        for( int j=0; j<line.length; j++ ) {
            System.out.print( "|" );

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

if文でLEFTかRIGHTかを判断し、それに基づいてスペースを前に入れるか後に入れるかを決めています。


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

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



ズレているように見えますが、ターミナルの実行結果は揃っているはずです。

ターミナル確認
ターミナル確認



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


新規作成 【Hyou8.java】

public class Hyou8 {

    public static final int LEFT = 0;
    public static final int RIGHT = 1;

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

        int[] max = maxWidth( data );

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

    public static void drawTable( String[][] data, int flag ) {

        int[] max = maxWidth( data );

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

    public static void drawTable( String[][] data, int[] flags ) {
        int[] max = maxWidth( data );
        for( int i=0; i<data.length; i++ ) {
            drawLine( data[i], max, flags[i] );
        }
    }

    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] )+1; k<=max[j]; k++ ) {
                System.out.print( " " );
            }
        }
        System.out.println( "|" );
    }

    private static void drawLine( String[] line, int[] max, int flag ) {
        if( flag == LEFT ) {
            for( int j=0; j<line.length; j++ ) {
                System.out.print( "|" + line[j] );
                for( int k=count( line[j] )+1; k<=max[j]; k++ ) {
                    System.out.print( " " );
                }
            }
        }
        else if( flag == RIGHT ) {
            for( int j=0; j<line.length; j++ ) {
                System.out.print( "|" );
                for( int k=count( line[j] )+1; k<=max[j]; k++ ) {
                    System.out.print( " " );
                }
                System.out.print( line[j] );
            }
        }
        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 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;
    }
}



このプログラムでは、flagの配列を用意しています。
int[] flags = { LEFT, LEFT, RIGHT, RIGHT };


drawTable()メソッドには、flagの配列を受け取るメソッドが増えています。


flagの配列を受け取ったdrawTable()メソッドは、flags[0]から順番にdrawLineメソッドにflagを渡していきます。
これによりラインごとに右寄せか左寄せか違う表示になります。


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

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

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



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


新規作成 【Hyou9.java】

public class Hyou9 {

    public static final int LEFT = 0;
    public static final int RIGHT = 1;
    public static final int CENTER = 2;

    public static void main( String[] argv ) {
    
        String[][] data = {
            { "01", "02", "03", "04", "05", "06" },
            { "田中", "木村", "佐藤", "鈴木", "高橋", "斉藤" },
            { "太郎", "二郎", "三郎", "四郎", "五郎","六郎" }, 
            { "tanaka","kimura", "satou", "suzuki", "takahashi","saitou" }
        };

        int[] flags = { CENTER, CENTER, CENTER, LEFT };
        drawTable( data, flags );
    }
    
    public static void drawTable( String[][] data ) {
   
        int[] max = maxWidth( data );
        for( int i=0; i<data.length; i++ ) {
            drawLine( data[i], max );
        }
    }

    public static void drawTable( String[][] data, int flag ) {

        int[] max = maxWidth( data );

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

    public static void drawTable( String[][] data, int[] flags ) {

        int[] max = maxWidth( data );

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

    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] )+1; k<=max[j]; k++ ) {
                System.out.print( " " );
            }
        }
        System.out.println( "|" );
    }

    private static void drawLine( String[] line, int[] max, int flag ) {
        if( flag == LEFT ) {                                                                                
            for( int j=0; j<line.length; j++ ) {
                System.out.print( "|" + line[j] );
                for( int k=count( line[j] )+1; k<=max[j]; k++ ) {
                    System.out.print( " " );
                }
            }
        }
        else if( flag == RIGHT ) {
            for( int j=0; j<line.length; j++ ) {
                System.out.print( "|" );
                for( int k=count( line[j] )+1; k<=max[j]; k++ ) {
                    System.out.print( " " );
                }
                System.out.print( line[j] );
            }
        }
        else if( flag == CENTER ) {
            for( int j=0; j<line.length; j++ ) {
                System.out.print( "|" );
                if( (max[j]%2)==0 ) {
                    for( int k=0; k < (((max[j]) - ( count( line[j] )))/2); k++ ) {
                        System.out.print( " " );
                    }
                    System.out.print( line[j] );
                    for( int r=0; r < (((max[j]) - ( count( line[j] )))/2); r++ ) {
                        System.out.print( " " );
                    }
                }
                else if( (max[j]%2)==1 ) {
                    for( int k=0; k <= ((((max[j]) - 1 ) - (count( line[j] )))/2); k++ ) {
                        System.out.print( " " );
                    }
                    System.out.print( line[j] );
                    for( int r=0; r < ((((max[j]) - 1 ) - (count(line[j] )))/2); r++ ) {
                        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 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;
    }
}



public static final int CENTER = 2;
この記述では、定数にCENTERを追加しています。
中央寄せに使います。

else if( flag == CENTER ) {
    for( int j=0; j<line.length; j++ ) {
        System.out.print( "|" );
        if( (max[j]%2)==0 ) {
            for( int k=0; k < (((max[j]) - ( count( line [j] )))/2); k++ ) {
                System.out.print( " " );
            }
            System.out.print( line[j] );
            for( int r=0; r < (((max[j]) - ( count( line [j] )))/2); r++ ) {
                System.out.print( " " );
            }
        }
        else if( (max[j]%2)==1 ) {
            for( int k=0; k <= ((((max[j]) - 1 ) - ( count( line[j] )))/2); k++ ) {
                System.out.print( " " );
            }
            System.out.print( line[j] );
            for( int r=0; r < ((((max[j]) - 1 ) - (count( line[j] )))/2); r++ ) {
                System.out.print( " " );
            }
        }
    }
}

これが、中央寄せをさせる部分です。

for( int j=0; j<line.length; j++ ) {

最初のループは、横並びの文字列の数だけループさせます。
今回は、line.length = 6です。


if( (max[j]%2)==0 )
文字列の最大数が割り切れる場合と割り切れない場合の処理に分けています。
数字が1桁の場合、余りが切り捨てられて割り切れることになってしまうので今回のみ2桁にしています。


k < (((max[j]) - ( count( line [j] )))/2)
最大数からこの文字列の数を半分にした値を引いています。


count( line [j] )
これによりcount()メソッドからこの文字列のカウント数を得ています。


文字列の前後に同じ数のスペースを入れています。


else if( (max[j]%2)==1 )
余りが1だったとき、後ろ側のスペースの数を一つ減らしています。
k <=r <の違いです。


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

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

~/Desktop/Programming/JP $ java Hyou9
      
|  01  |  02  |  03 |  04  |    05   |  06  |
| 田中 | 木村 | 佐藤| 鈴木 |   高橋  | 斉藤 |
| 太郎 | 二郎 | 三郎| 四郎 |   五郎  | 六郎 |
|tanaka|kimura|satou|suzuki|takahashi|saitou|



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


新規作成 【Hyou10.java】

public class Hyou10 {

    public static final int LEFT = 0;
    public static final int RIGHT = 1;
    public static final int CENTER = 2;

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

        int[] flags = { CENTER, CENTER, CENTER, CENTER };
        drawTable( data, flags );
    }

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

        drawTable( data, LEFT );
    }

    public static void drawTable( String[][] data, int flag ) {
   
        int[] max = maxWidth( data );
        for( int i=0; i<data.length; i++ ) {
            drawLine( data[i], max, flag );
        }
    }

    public static void drawTable( String[][] data, int[] flags ) {

        int[] max = maxWidth( data );

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

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

        drawLine( line, max, LEFT );
    }

    private static void drawLine( String[] line, int[] max, int flag ) {
        if( flag == LEFT ) {                                                                                
            for( int j=0; j<line.length; j++ ) {
                System.out.print( "|" + line[j] );
                for( int k=count( line[j] )+1; k<=max[j]; k++ ) {
                    System.out.print( " " );
                }
            }                	
        }
        else if( flag == RIGHT ) {
            for( int j=0; j<line.length; j++ ) {
                System.out.print( "|" );
                for( int k=count( line[j] )+1; k<=max[j]; k++ ) {
                    System.out.print( " " );
                }
                System.out.print( line[j] );
            }
        }

        else if( flag == CENTER ) {
            for( int j=0; j<line.length; j++ ) {
                int s = ( max[j] - count( line[j] ) );
                int s1, s2;
                if( (s % 2) == 0 ) {
                    s1 = s2 = s/2;
                }
                else {
                    s1 = s/2 +1; s2 = s/2;
                }
                System.out.print( "|" );
                for( int k=1; k<=s1; k++ ) {
                    System.out.print( " " );
                }
                System.out.print( line[j] );
                for( int k=max[j]-s2; 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 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;
    }
}



「Hyou9.java」を少しだけ書き換えたプログラムです。
drawTable( String[][] data )やdrawLine( String[] line, int[] max )を変えています。


中央寄せの処理を少し書き換えました。

else if( flag == CENTER ) {
    for( int j=0; j<line.length; j++ ) {
        int s = ( max[j] - count( line[j] ) );
        int s1, s2;
        if( (s % 2) == 0 ) {
            s1 = s2 = s/2;
        }
        else {
            s1 = s/2 +1; s2 = s/2;
        }
        System.out.print( "|" );
        for( int k=1; k<=s1; k++ ) {
            System.out.print( " " );
        }
        System.out.print( line[j] );
        for( int k=max[j]-s2; k<max[j]; k++ ) {
            System.out.print( " " );
        }
    }
}



先ほどはfor文の条件の中で一気に計算していたのですが、計算は外に出して書き直ししました。


出力結果は全く同じですが、数字が1桁の場合でも対応できるようになっています。

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

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



18 | 表】 << 【ホーム】 >> 【20 | StringBuffer




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