>>この記事には書き直した新しいページがあります。<<
<<前 [TOP] 次>>
メモ帳を開いて次のプログラムを作ってみましょう。
【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つの引数を使うときは今までになかったdrawTable( String data, int flag )メソッドの方が呼ばれます。
配列とLEFTかRIGHTかのフラッグを引数として渡します。
drawLine()メソッドも2つあるのが解ると思います。
フラッグを引数としてもらうメソッドを見てください。
if文でLEFTかRIGHTかを判断し、それに基づいてスペースを前に入れるか、後に入れるかを決めています。
出力結果です。
メモ帳を開いて次のプログラムを作ってみましょう。
【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を渡していきます。
これにより、ラインごとに右寄せか左寄せか違う表示になります。
実行結果です。
メモ帳を開いて次のプログラムを作ってみましょう。
【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 = { { "1", "2", "3", "4", "5", "6" }, { "田中", "木村", "佐藤", "鈴木", "高橋", "斉藤" }, { "太郎", "二郎", "三郎", "四郎", "五郎","六郎" }, { "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
if( (max[j]%2)==0 )
文字列の最大数が割り切れる場合と割り切れない場合の処理に分けています。
k < (((max[j]) - ( count( line [j] )))/2)
最大数から、この文字列の数を半分にした値を引いています。
count( line [j] )
これにより、count()メソッドからこの文字列のカウント数を得ています。
文字列の前後に同じ数のスペースを入れています。
else if( (max[j]%2)==1 )
余りが1だったとき、後ろ側のスペースの数を一つ減らしています。
(k <=)と(r <)の違いです。
出力結果です。
メモ帳を開いて次のプログラムを作ってみましょう。
【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文の条件の中で一気に計算していたのですが、計算は外に出して書き直ししました。
出力結果は全く同じです。
<<前 [TOP] 次>>