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

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Javaプログラミング入門その16 表を作成するプログラム

<<前  [TOP]  次>>


メモ帳を開いて次のプログラムを作ってみましょう。


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に与える文字列の文字数が多いと、うまく "|" が揃わないところにあります。


出力結果です。





メモ帳を開いて次のプログラムを作ってみましょう。


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


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


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


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


出力結果です。





メモ帳を開いて次のプログラムを作ってみましょう。


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()メソッドは、各列ごとの最大文字数に対してスペースの数を決めています。
列の大きさは文字数の大きさによって違ってきます。


出力結果です。





メモ帳を開いて次のプログラムを作ってみましょう。


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] );
  
                                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++ ) {
				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 { 
				count+=2;
			}
		}
		return count;
	}
}



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


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

char[] a = str.toCharArray();

この文は、与えられたString型の文字列strを、一文字ずつに分けて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のパッケージを利用しています。


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


出力結果です。





メモ帳を開いて次のプログラムを作ってみましょう。


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] );
   
                                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++ ) {
                                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)


出力結果です。





メモ帳を開いて次のプログラムを作ってみましょう。


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] )+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++ ) {
 
                                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;
			}
		}
                return count;
        }
}



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


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


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


結果は、Hyou4.javaと同じです。





<<前  [TOP]  次>>