雑草SEの備忘録

東大を卒業し、SEとして働くことになった。備忘録的に作業を綴る。

転職直前の気持ち

転職をした。

といっても、20日までは今の会社に籍はあって、21日から新しい会社に移るのでまだ過去形ではない。

新卒で、今の会社に入って1年と4か月。多分短いと言われるだろう。周りからは3年は居ろとも言われた。上司に退職の意思を告げたとき、こうして短期間で職を変えることが僕にとって良いこととは思えないと止められたりもした。

転職活動をしはじめたのが4月末から。その間、精神的に紆余曲折があった。

まずは、次の会社への入社を4日後に控えた現時点での気持ちを率直につづってみたいと思う。気持ちというのは移ろいやすく、おそらく今の気持ちは3か月後にはないだろうから、今綴らなければならないと思う。備忘録だと思って書く。


正直なところ、今は不安で押しつぶされそうだ。

現職は、全世界で10万人以上の従業員がいる大企業。SI業界ではそれなりに名の知られた会社だ。一方、次は従業員100人にも満たない企業だ。今年で創業10周年。本格的にサービスインしてからは、7~8年たっているから、ベンチャー企業と言えるのだと思う。

現職の様な大企業では、教育もしっかりしているし、福利厚生もそれなりに手厚い。寮もあって、光熱費込で月額1万5000円を負担するだけで良い。大企業の中では潤沢な福利厚生とは言えないが、全体的に見れば手厚いと言える。
しかし、次の会社は寮などない。一定の条件を満たせば近距離手当がつくが、提示された条件では、その近距離手当を含んで現職と同程度である。光熱費も当然自分で払う。残業代も、45時間/月までは支給されない。必然、生活は苦しくなる。

それでも僕は転職を決意した。

私のモットーは、「若い時の苦労は買ってでもしろ」だ。

年収が多少下がろうとも、若い時からたくさん経験ができるであろう会社を選んだ。もちろんそういう経験ができるかどうかは分からないが、スピード感は、今の会社よりも早いであろう。

現職に大きな不満があったわけではない。もちろん、どこの会社に勤めようが、多少の不満はあるであろう。ただ、職場での人間関係も良好だったし、直前まで携わっていたプロジェクトでは、残業は多かったものの、仕事のやりがいもあった。積極的に自分から仕事をとりにいっていた。テスト工程のマネジメントの仕事をしていたのだが、テストがスムーズに進められるようにスケジュールを作成し、テスト仕様書も作成した。BPさんとのやりとりも僕が直接やっていたし、障害が起きたときの対応も僕がしていた。
先輩も関西人だったからかとても面白かった。上司からは、二人を見てると漫才の様だとも言われるぐらいだった。僕はテスト推進チームに属していたが、違うチームの人からは、テストチームは楽しそうで羨ましいと言われたりもした。

ただ、やはり大企業ならではの弊害もあって、思うところがあって退職することになった。ここでは詳細は別の機会に譲る。

現職での良好な人間関係もそうだし、仕事も覚え始めて面白くなってきてからの退職だったので、正直なんで辞めなければいけないのかという思いもあった。未だにある。だけれども、今の会社で定年まで働くイメージがまったく湧かないし、僕はやっぱり大企業に向かないんだと思う。経営者が直接見える企業で働きたいというのが就活していたころからの思いだった。小さいながらも会社が一丸となって、みんながみんな同じ方向を見て進む。そういう会社で働きたかった。
ただ、大企業に入りやすいのは圧倒的に新卒。大企業の経験もしたかったので、新卒の時は、今の会社を選んだ。知人に今の会社に勤めている人もいたので、雰囲気も分かって働くイメージが湧いたというのもある。

今度の会社は、エージェント経由で紹介された企業だ。面接は3回あって、2次面接と最終面接は同じ日に行ってくれた。しかも今の会社の定時を過ぎてからだったので、最後は23時近くだった。その日、オフィスの見学もさせてくれて、さらには、その日のうちに内定を出してくれた。僕を採用したいという熱意をすごく感じた。
内定のあと、オファー面談という、条件が提示される面談がある。その時にも、代表取締役、開発部の部長、人事部の部長というメンバーで面談を受けた。正直、人事部の人だけかと思ったので、びっくりした。かなり重いと感じたけど、結局はその熱意にやられた。

だからこそ、余計に不安だ。一応、現職でJavaの経験はあるとはいえ、転職先では、Ruby。やったことない。しかも、部長は東大卒だし、以前は外資系のIT系コンサル会社に勤めてたと言うし、周りの人も優秀そう。すごい期待してくれてるのはひしひしと感じたが、正直私は何もできない。それでもポテンシャルを買ってくれたんだと思う。

新しい職場での人間関係も不安だ。面談では、僕はその会社に居そうだとも言われた。やはり会社によって勤めている人の雰囲気は似ている。僕はその会社に居そうだというのだから、雰囲気は近しいのだろう。実際、オフィスを訪ねて働いている人と会話したときも、大きな隔たりは感じなかった。だからきっと大丈夫なんだろう。

しかし、いくら不安に思ってももう動き出してしまっている。後戻りはできないところまできてしまった。ここまできたら、どうせ死ぬわけじゃないしと思って腹をくくって頑張るしかない。

日立の社員が転職して後悔しているブログが有名になったが、私は後悔するのだろうか。いや、後悔するかしないかは次の会社での自分次第。もうやるしかない。

クイックソートのソース(Java)

クイックソートアルゴリズムJavaで実現したときのソースです。
クイックソートってどんなものかっていうのは、他のサイトをあたってください。
軸の取り方はもう少し工夫しても良いかもしれません。平均の値をとるとか。

// クイックソートのメソッド
public static int[] quickSort(int[] input) {
	return quick(input, 0, input.length - 1);
}

private static int[] quick(int[] input, int left, int right) {
	int[] array = input;
	int currentLeft = left;
	int currentRight = right;

	// 要素数が1以下のときは、何もせず返却する
	if (array.length < 2)
		return array;

	// クイックソートの場合、軸の選び方は色々あるが、このメソッドでは
	// 軸は、currentLeftとcurrentRightの真ん中にある要素とする。
	int pivot = array[(currentLeft + currentRight) / 2];

	do {
		while (array[currentLeft] < pivot) {
			currentLeft++;
		}

		while (array[currentRight] > pivot) {
			currentRight--;
		}
		if (currentLeft <= currentRight) {
			int index1 = currentLeft++;
			int index2 = currentRight--;
			int temp = array[index1];
			array[index1] = array[index2];
			array[index2] = temp;
		}
	} while (currentLeft <= currentRight);

	if (left < currentRight)
		quick(array, left, currentRight);

	if (currentLeft < right)
		quick(array, currentLeft, right);
	return array;
}

マージソートのソース(Java)

マージソートのソースのアルゴリズムJavaで実現したときのソースになります。
アルゴリズムの説明は、他のサイトをあたってください。あしからず。。

public static int[] mergeSort(int[] input) {
	// 分割の配列
	int[] array = input;
	// 並び替えた数値を格納する配列。最終的にこの配列を返す。
	int[] b = new int[array.length];

	// 分割する添え字
	int middle = (0 + array.length - 1) / 2;
	// 分割した配列の前半分を格納する配列
	int[] array1 = new int[middle + 1];

	// 分割した配列の後ろ半分を格納する配列
	int[] array2;
	// arrayの要素数が1以上のとき
	if (0 < array.length) {
		array2 = new int[array.length - middle - 1];
		// arrayの要素数が0以下のとき
	} else {
		array2 = new int[0];
	}

	// 要素数が1以下のときは、何もせず返却する
	if (array.length < 2) {
		return array;
	}
	// 前半部分をarray1にコピー
	System.arraycopy(array, 0, array1, 0, middle + 1);

	// 後半部分をarray1にコピー
	System.arraycopy(array, middle + 1, array2, 0, array.length - middle - 1);

	// 前半部分を並び替え(再帰的に)
	array1 = mergeSort(array1);

	// 後半部分を並び替え(再帰的に)
	array2 = mergeSort(array2);

	int bindex = 0;
	int array1index = 0;
	int array2index = 0;

	for (int i = 0; i < array.length - 1; i++) {
		if (array1index < array1.length && array2index < array2.length) {
			if (array1[array1index] < array2[array2index]) {
				b[bindex] = array1[array1index];
				array1index++;
			} else {
				b[bindex] = array2[array2index];
				array2index++;
			}
			bindex++;
		}
	}
	if (array1index > array2index) {
		for (int j = array2index; j < array2.length; j++, bindex++) {
			b[bindex] = array2[j];
		}
	} else {
		for (int j = array1index; j < array1.length; j++, bindex++) {
			b[bindex] = array1[j];
		}
	}
	return b;
}

バブルソート(基本交換法)のソース(Java)

バブルソート(基本交換法)のアルゴリズムJavaで実現したときのソースです。
バブルソートってどんなものかっていうのは、他のサイトをあたってください。
バブルソートにはいくつかのパターンがありますが、今回紹介するのは、大きな数値を右に持っていくものになります。

public static int[] bubbleSort(int[] input) {
	int[] array = input;
	int temp;
	for (int j = 1; j < array.length; j++) {
		for (int i = 0; i < array.length - j; i++) {
			if (array[i] > array[i + 1]) {
				temp = array[i + 1];
				array[i + 1] = array[i];
				array[i] = temp;
			}
		}
	}
	return array;
}

jQueryを利用して良い感じの選択ボタンを作る


何か質問とかを作ったときに、選択ボタンってありますよね。

それで、簡単なものだと、ラジオボタンとかになるんでしょうけど、それだとデザイン的にダサいと思ったので、もっとボタンっぽくして、いかにも選択されたような感じのものを作りたいなと思っていました。

サンプルとしては、こんな感じです。

このサンプルでは、AのボタンをクリックするとBとCのボタンが薄くなり、Bのボタンをクリックすると、AとCのボタンが薄くなり、Cのボタンをクリックすると(以下略。

 

こんな感じのを作りたいなと。

で、作ってみたので、ソースのサンプルを紹介します。

ちなみに、ボタンは画像となっており、パワポで作りました。

今回は、jQueryを使うので、まずはこれを読み込みます。

<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>

jQueryのソースファイルをダウンロードして読みこんでも良いのですが、面倒なのでCDN(コンテンツデリバリーネットワーク)から引っ張ってきます。バージョンは1.11.2を使ってますが、他のバージョンでも良いと思います。たまたま使ったのが1.11.2だっただけです。深い意味はありません。

まずはHTMLから。単純に画像にidをつけ、spanタグでくくっただけですね。spanタグにもidをつけてあります。

<span id="spa"><img src="a.png" id="a"></span>
<span id="spb"><img src="b.png" id="b"></span>
<span id="spc"><img src="c.png" id="c"></span>

次に、Javascriptの部分。

$(document).on('click', 'span#spa', function() {
		choiced('a', 'b', 'c');
})
$(document).on('click', 'span#spb', function() {
		choiced('b', 'a', 'c');
})
$(document).on('click', 'span#spc', function() {
		choiced('c', 'a', 'b');
})

function choiced(choice0, choice1, choice2) {
var mychoice0 = document.getElementById(choice0);
var otherchoice1 = document.getElementById(choice1);
var otherchoice2 = document.getElementById(choice2);
$(mychoice0).animate({
	opacity : "1"
}, {
	duration : 200,
});
$(otherchoice1).animate({
	opacity : "0.3"
}, {
	duration : 200,
});
$(otherchoice2).animate({
	opacity : "0.3"
}, {
	duration : 200,
});
}

大丈夫だと思いますが、これを、

<script type="text/javascript">
</script>

の中に入れてくださいね。

jQueryというか、JavaScript自体初心者なので、ソースが悪いとかいろいろご意見あると思います。ここをこうした方がいいよとか教えてくれる優しい方、教えてくださいm(_ _)m


ちょっとソースの解説しておきましょう。


言うまでもなくポイントは、choiced()メソッドですね。


choiced()メソッドの引数に三つ変数を引き渡しています。


最初の引数は、クリックされた画像のid、二つ目の引数、三つ目の引数はクリックされた以外の画像のidです。


それで、クリックされた画像に関しては、opacityプロパティを1にして透明度を無くし、それ以外に関しては、opacityを0.3にしています。この数値は、透明度なので、適宜お好みの透明度に指定してください。


jQueryのanimateメソッドで、durationに200を指定しています。durationとは、アニメーションの動作時間で、単位はミリ秒です。

このchoiced()メソッドを定義したら、あとは、クリックされた各ボタンに応じてjQueryのメソッドを利用していきます。


それが、$(document)から始まる3つですね。


画像が4つ、5つと増えていってもchoiced()メソッドの引数を増やすことで対応できるソースとなっています。


もっとうまいやりかたがあるかもしれませんが、ひとまずこれで動作したので参考までに。。

補足

これだと、画像の上にカーソルがやってきても指マークにならないですね。ここは、CSSで指定すれば問題ありません。
まずは、imgタグにclass名をつけて、

<span id="spa"><img src="a.png" id="a" class="css20150509"></span>
<span id="spb"><img src="b.png" id="b" class="css20150509"></span>
<span id="spc"><img src="c.png" id="c" class="css20150509"></span>

つけたclass名のオプションにcursor、属性にpointerとすればOK!

.css20150509 {
	cursor: pointer;
}

あとはこの選択された値をどうバックサイドに引き渡すか、ですが、これはまた別の機会に・・・。

JavaのComparatorを使って配列を並び替える(課題解答編)

昨日の記事が個人的には気持ちよく書けたので、忘れないうちに課題の回答例を載せておきます。
色々なやり方があると思いますので、試してみてくださいね。

問1.配列studentarrayを身長順に並べよ。

Arrays.sort(studentarray, new Comparator<Student>() {
	public int compare(Student student1, Student student2) {
		return student1.getHeight() - student2.getHeight();
	}
});


問2.配列studentarrayを年齢順に並べよ。年齢が同じ場合は、身長順に並べること。

Arrays.sort(studentarray, new Comparator<Student>() {
	public int compare(Student student1, Student student2) {
		int temp = student1.getAge() - student2.getAge();
		if (temp == 0)
			temp = student1.getHeight() - student2.getHeight();
		return temp;
	}
});


問3.配列studentarrayを名前順に並べよ。名前が同じ場合は、身長順に並べること。

Arrays.sort(studentarray, new Comparator<Student>() {
	public int compare(Student student1, Student student2) {
		int temp = student1.getName().compareTo(student2.getName());
		if (temp == 0)
			temp = student1.getHeight() - student2.getHeight();
		return temp;
	}
});


問4.配列studentarrayのサイズを7にし、以下のを追加する。
   studentarray[6] = new Student("くらもとますみ", 26, 'x', 168)
   この状態で、性別が'x'→'f'→'m'の順にならべよ。同じ性別内では、年齢順に、同じ年齢であれば名前順(あいうえお順)に並べよ。
(解説)
いろいろな実装法があると思いますが、表を使ってまとめる方法を紹介します。
compare()メソッドの引数は、student1とstudent2の二つですが、今回、性別は、f,m,xの3つですので、3^2(3の2乗)で9通りあります。例えば、同じ性別の時は変数tempには0のまま、それ以外の時は、正の値や負の値を与えるような実装をします。今回は、x→f→mの順番に並べたいので、student1の性別がfでstudent2の性別がmのとき、returnで正の値を返すようにします。
(この表の正負を逆にするとm→f→xの順に並びます。ちなみに私は最初逆にしてましたが、実行してみて逆であることに気づきました。)

st1\st2 f m x
f 0 -1 1
m 1 0 1
x -1 -1 0

この6つのif文を抜けてもtempが0のまま(つまり性別が同じ)であれば、年齢で、年齢も同じならば名前で並び替えるようにif文を続けます。

Arrays.sort(studentarray, new Comparator<Student>() {
	public int compare(Student student1, Student student2) {
		int temp = 0;
		// 性別から、順序を定めるために全9通りのうち性別が異なる
		// 6通りから判断し、tempに格納する。同じ性別の場合は0のまま。
		if (student1.getSex() == 'f' && student2.getSex() == 'm')
			temp = -1;
		if (student1.getSex() == 'f' && student2.getSex() == 'x')
			temp = 1;
		if (student1.getSex() == 'm' && student2.getSex() == 'f')
			temp = 1;
		if (student1.getSex() == 'm' && student2.getSex() == 'x')
			temp = 1;
		if (student1.getSex() == 'x' && student2.getSex() == 'f')
			temp = -1;
		if (student1.getSex() == 'x' && student2.getSex() == 'm')
			temp = -1;
		// 同じ姓別である場合は、年齢順に
		if (temp == 0)
			temp = student1.getAge() - student2.getAge();
		// 同じ性別で同じ年齢ならば、名前順に
		if (temp == 0) 
			temp = student1.getName().compareTo(student2.getName());
		return temp;
	}
});

本来ならば、前述の表の様な二次元配列を作成して、fを0、mを1、xを2に読み替えて二次元配列から-1,0,1を取り出す方法がスマートなのかもしれませんが、少しわかりにくく、Comparatorの使い方の説明とは趣旨が離れてしまうので辞めました。

以上、JavaのComparatorの説明でした。お読みいただき、有難うございました。

JavaのComparatorを使って配列を並び替える

Javaで配列の並び替えをしようと思った時に少し慣れるのに時間がかかったので、書いておきたいと思います。

配列の並び替えには、

Arrays.sort(配列名);

みたいな感じでやれば昇順に並べ替えられます。Listとかだと、Collection.sort()なんてのを使うんだと思います。なんですが、ここの配列名のところで指定できる配列は、intとかcharとか基本データ型の配列です。

もし、何かのオブジェクトを入れたいのであれば、実装方法は二つあります。

1.配列のオブジェクトに、Comparableインタフェイスを実装する

2.配列のオブジェクトはそのままで、Comparatorを用いる(後述)

の二つあると思います。今回は、2のやり方についてのみ記載します。(1はまだ知らん。。)

Comparatorの使い方については、いろいろググりましたが、無駄にラムダ式で記載されていたり、なぜか-1とかが使われていたり、ちょっと私には分かりにくかったです。

というわけで、自分で説明してみようと思います。

0.説明の準備
1.年齢順に並べる
2.文字順で並び替え
3.年齢順、あいうえお順で並び替え
4.性別、年齢、名前の順に昇順に並び替える
5.課題


0.説明の準備
まずは、基本データ型の配列ではなくて、あるエンティティの配列で並び替えを行いたいと思うので、そのエンティティを用意します。今回は、Student型のエンティティで説明します。

public class Student {
	// 年齢
	private int age;
	// 身長
	private int height;
	// 名前
	private String name;
	// 性別
	private char sex;
	// コンストラクタ
	public Student(String name, int age,  char sex, int height){
		this.age = age;
		this.height = height;
		this.name = name;
		this.sex = sex;
	}
	// 以下、ゲッターとセッター
	public int getAge(){ return age; }
	public void setAge(int age){ this.age = age; }
	public int getHeight() { return height; }
	public void setHeight(int height) { this.height = height; }
	public String getName() { return name; }
	public void setName(String name) { this.name = name; }
	public char getSex() { return sex; }
	public void setSex(char sex) { this.sex = sex; }
}

次に、mainメソッドのクラス(名前はなんでもいいが、昔エネルギーの研究をしていたということもあり、SmartEnergyを使ってみた)をつくり、そこに配列を用意します。ついでに、配列を表示させるSystem.out.println()もつけておきます。☆☆☆のところは、あとから、配列を並び替えるために記述する箇所です。

public class SmartEnergy {
	public static void main(String[] args) {
		Student[] studentarray = new Student[6];
		studentarray[0] = new Student("いのうえなおみ", 24, 'f', 158);
		studentarray[1] = new Student("たかはしたつや", 23, 'm', 176);
		studentarray[2] = new Student("いのうえなおみ", 27, 'm', 164);
		studentarray[3] = new Student("えのもとめぐみ", 24, 'f', 162);
		studentarray[4] = new Student("えのもとたすく", 24, 'm', 178);
		studentarray[5] = new Student("さくらぎたかはる", 26, 'f', 163);

		☆☆☆

		for (Student student : studentarray) {
			System.out.println(student.getName() + "," + student.getAge() + ","
					+ student.getSex() + "," + student.getHeight());
		}

	}
}


1.年齢順に並べる
例えば、年齢順に並べるには、次のようにします。☆☆☆の部分に挿入してください。

(記述例1)
Arrays.sort(studentarray, new Comparator<Student>() {
	public int compare(Student student1, Student student2) {
		return student1.getAge() - student2.getAge();
	}
});

Arrays.sortでは、一つ目の引数に、並び替えたい配列を、二つ目の引数には、並び替え方を記述したComparatorを実装したクラスを入れます。今回は、二つ目の引数は、インナークラスとしています。
新たにクラスを作成して、以下のように記述しても構いません。
まずは、☆☆☆のところに以下の一文を記述。SampleComparatorとは、すぐあとで作るComparatorを実装したクラスです。

(記述例2)
Arrays.sort(studentarray, new SampleComparator());

次に、新しいクラスを作りSampleComparatorと名付けることにします。このクラスには、Comparatorを実装します。

(記述例2つづき)
class SampleComparator implements Comparator<Student>{
	public int compare(Student student1, Student student2) {
		return student1.getAge() - student2.getAge();
	}
}

ちなみに、ComparatorのジェネリクスをStudentにしていますが、これは並び替えの対象がStudentだからです。ジェネリクスを指定しなくても以下のように書けばコンパイルはできますし、正常に動作します。

(記述例3:推奨しない)
Arrays.sort(studentarray, new Comparator() {
	public int compare(Object student1, Object student2) {
		return ((Student)student1).getAge() - ((Student)student2).getAge();
	}
});

なんですが、Eclipseを使ってると、色々と警告がでます。単純にダウンキャストを使ってるので未検査のダウンキャストかと思いきや、そうじゃないみたいです。中身はよく分かりませんが、この書き方は推奨しないよということみたいです。Java1.4まではこれで良かったんだそうな。。(昔はジェネリクスという考え方が無かった)
これらの実装をして、mainメソッドのあるクラス(私の場合SmartEnergy)を実行すると、

(実行例1)
たかはしたつや,23,m,176
いのうえなおみ,24,f,158
えのもとめぐみ,24,f,162
えのもとたすく,24,m,178
さくらぎたかはる,26,f,163
いのうえなおみ,27,m,164

といったのがコンソールに表示されると思います。確かに、年齢順に並び替えられています!素晴らしい!

さて、並び替えのルールはこのComparatorの中に記載されています。
一番最初の(記述例1)に戻って下さい。returnのところで、student1の年齢からstudent2の年齢を引いたものを返却しています。student1の年齢の方が大きい場合が正になりますから、結果をみると、student1の年齢がstudent2の年齢よりも大きい時に正を返す場合は、年齢で昇順に並び替わるというわけですね。
ためしに、returnの返却値をstudent2.getAge() - student1.getAge()とすると、年齢で降順(年齢が大きい順)に並び替わります。
正直、このあたり、どっちが昇順でどっちが降順なのかわからなくなります。こういうときは私は、ためしに小さいプログラムを組んで試してみています。
基本的にComparatorの使い方は以上ですが、続いて文字で並び替えてみましょう。

2.文字順で並び替え
あいうえお順で並び替えるときはStringのcompareTo()メソッドを使います。次のコードを☆☆☆に書き加えてください。(1.で☆☆☆に挿入したのは一旦削除してください)

Arrays.sort(studentarray, new Comparator<Student>() {
	public int compare(Student student1, Student student2) {
		return student1.getName().compareTo((student2.getName()));
	}
});

実行して、次のような画面が出ていればOKです。あいうえお順に並び替えることが出来ました。

(実行例2)
いのうえなおみ,24,f,158
いのうえなおみ,27,m,164
えのもとたすく,24,m,178
えのもとめぐみ,24,f,162
さくらぎたかはる,26,f,163
たかはしたつや,23,m,176

ただし、注意しなければいけないのは、StringのcompareTo()メソッドはUNICODE的な順番を比較しています。ひらがなであれば問題ないですが、漢字だと上手くいかない可能性が高いです。


3.年齢順、あいうえお順で並び替え
それでは、年齢順に並べつつ、かつ、同じ年齢の場合はあいうえお順に並べてみましょう。(実行例1)では、「えのもとめぐみ」のあとに「えのもとたすく」となっており、あいうえお順ではありません。
年齢とあいうえお順で並び替えるには、まず、年齢で値を比較し(年齢なので差をとる)、ゼロであれば(同じ年齢であれば)、次にあいうえお順に並べるという手順を踏みます。

Arrays.sort(studentarray, new Comparator<Student>() {
	public int compare(Student student1, Student student2) {
		int temp = student1.getAge() - student2.getAge();
		if (temp == 0){
			return student1.getName().compareTo(student2.getName());
		}
		return temp;
	}
});

上の例ですと、student1の年齢からstudent2の年齢を引いた値をtempに代入します。tempがゼロであれば、同じ年齢であるということなので、今度は、あいうえお順で比較(compareTo()メソッド)し、それを返却するひょうにしています。実行すると次のような結果が出ると思います。年齢順に並んでいますし、「えのもとたすく」が「えのもとめぐみ」より前に来ているのが分かりますね。

(実行例3)
たかはしたつや,23,m,176
いのうえなおみ,24,f,158
えのもとたすく,24,m,178
えのもとめぐみ,24,f,162
さくらぎたかはる,26,f,163
いのうえなおみ,27,m,164


4.性別、年齢、名前の順に昇順に並び替える
もう少し応用して、条件を3つにしてみましょう。男性(m)を先に、女性(f)を後に並び替えるようにするにはどうすれば良いでしょうか。
今回の例では、性別に'f'や'm'といったchar型を用いていますので単純に大小比較ができます。ですが、練習問題ではLGBTの方も勘案して、性別に'x'というものを加えて、LGBT→女性→男性の順に表示させる問題を出しています。今回は、char型の大小比較を使わないで実装してみましょう。

Arrays.sort(studentarray, new Comparator<Student>() {
	public int compare(Student student1, Student student2) {
		int temp = 0;
		if (student1.getSex() == 'm' && student2.getSex() == 'f')
			temp = -1;
		if (student1.getSex() == 'f' && student2.getSex() == 'm')
			temp = 1;
		if (temp == 0) {
			temp = student1.getAge() - student2.getAge();
			if (temp == 0) 
				temp = student1.getName().compareTo(student2.getName());
		}
		return temp;
	}
});

student1の性が'm'かつstudent2の性が'f'のときはtempに-1(負の数)を、student1の性が'f'かつstudent2の性が'm'のときはtempに1(正の数)を代入しています。それ以外(student1とstudent2の性が同じ)のときは、tempはゼロですので、その時は、まず年齢比較、次いで、あいうえお比較をしています。
これを実行すると、次のような結果が得られます。

たかはしたつや,23,m,176
えのもとたすく,24,m,178
いのうえなおみ,27,m,164
いのうえなおみ,24,f,158
えのもとめぐみ,24,f,162
さくらぎたかはる,26,f,163


5.課題
ここまでざっと説明をしてきました。説明だけでは理解が不十分だと思う方は、次の課題をやってみてください。
問1.配列studentarrayを身長順に並べよ。
問2.配列studentarrayを年齢順に並べよ。年齢が同じ場合は、身長順に並べること。
問3.配列studentarrayを名前順に並べよ。名前が同じ場合は、身長順に並べること。
問4.配列studentarrayのサイズを7にし、以下のを追加する。
   studentarray[6] = new Student("くらもとますみ", 26, 'x', 168)
   この状態で、性別が'x'→'f'→'m'の順にならべよ。同じ性別内では、年齢順に、同じ年齢であれば名前順(あいうえお順)に並べよ。

以上、「JavaのComparatorを使って配列を並び替える」でした。久しぶりにSE的なことを書いたので時間もかかったしつかれかました。課題の答えはあとで時間があればアップします。

2015/05/04 追記
解答アップしました!
normalse.hatenablog.jp