| Java プログラミング あの手この手 |
Javaっていうと、なんかかっこいい気がしますね(僕だけ?)。なぜでしょうか。たぶん、オブジェクト指向言語だからでしょうか。または、インターネットができそうだからでしょうか?ん〜なぞですね☆さて、くだらない話はこれくらいにしておいて、本題に入っていきます!ここでは、僕が便利だと思ったものをちょくちょく説明していきたいと思います。
これを作ろうとおもったのは、自分のメモリ不足のためです・・・。覚えきれないので(T_T)
![]()
| 配列のコピー |
さて、いきなりですが頑張っていきましょう。なにせ、初心者なので説明が下手でも許してください。間違ってたら連絡くださいね!
配列のコピーということですが、これは僕がよく失敗してしまったことから、解決策がうまれました。次のソースを見てください。
/*配列のコピーをしてみよう*/
class ArrayCopy1
{
public static void main(String[] args){
int[] a = new int[2];
int[] b = new int[2];
a[0] = 10;
a[1] = 10;
b = a; //配列をコピー *
b[0] = 100;
System.out.println("a[0] = " + a[0] + " a[1] =
" + a[1]);
System.out.println("b[0] = " + b[0] + " b[1] = " + b[1]);
}
}
このソースは、なんのエラーもなくうまいことまわりました。が!出力されたa[0]の値は”100”でした。・・・なぜでしょうか?僕は、これでかなり悩みました。簡単にいうと、同じものを、参照しているからなのです。*の時点でおかしいわけですね。b[0]の値を、変化させたらa[0]の値もかわってしまうわけです。そこで、すばらしい技があります!次のソースを見てください。
/*配列のコピーをしてみよう*/
class ArrayCopy2
{
public static void main(String[] args){
int[] a = new int[2];
int[] b = new int[2];
a[0] = 10;
a[1] = 10;
System.arraycopy(a, 0, b, 0, a.length); //配列をコピー *
b[0] = 100;
System.out.println("a[0] = " + a[0] + " a[1] =
" + a[1]);
System.out.println("b[0] = " + b[0] + " b[1] = " + b[1]);
}
}
これを、まわしてみると。出力は、b[0]の値だけ”100”になっています。成功ですね。ここで使用したのは、パッケージjava.langのクラスSystemのメソッドarraycopy()です。これは、指定位置で開始する指定ソース配列から、転送先配列の指定位置に配列をコピーします。具体的な使い方ですが、
arraycopy(Object array1, int num1, Object array2, int num2, int length)
このとき、配列array1のnum1番目からlength-1番目までの要素を、配列array2のnum2番目からlength-1番目にコピーします。上のソースの場合は、配列aの0番目から1番目までの要素を、配列bの0番目から1番目にコピーしたということです。わかるでしょうか?使い始めると、結構便利なので使ってみてください!for文でi一個づつコピーしてもいいんだけどね・・・。こっちのほうが、かっこいい!
![]()
| お気楽ソートプログラム |
ソートっていろいろありますね.バブルソートってかなり一般的に聞くかな?でも,かなり効率が悪いです.これより効率の悪いものはないであろうという前提のもと,非常に簡単にソートができます.ソースを見てみましょう.
/*超簡単お気楽ソート*/
import java.util.Arrays.;
class SortSample
{
public static void main(String[ ] args){
int[ ] array = new int[10];
System.out.println("ソート前");
for(int i=0; i<array.length; i++){
array[i] = (int)(Math.random()*10);
System.out.println(array[i]);
Arrays.sort(array); //お気楽ソート☆☆☆ *
System.out.println("ソート後");
for(int i=0; i<array.length; i++)
System.out.println(array[i]);
}
}
一応,ソート前とソート後を出力するようにしています.ソート後は,小さいものから順になっているはずです!大きいもの順に下ければ,出力をいじれば余裕ですね☆.ここで,使用したのは,パッケージjava.utilのクラスArraysのメソッドsort()です.使い方は簡単!
Arrays.sort(double[] db)
見た目からしてかんたんですね☆ここでは,double[ ]になっていますが,基本的に何でも入ります.オブジェクト型の配列だって入ります.だからあとは使い方しだいです.
すごい,簡単に配列のソートができましたね☆しかし,これは,配列だけに使える技なので,AlrrayList,Vectorを使った場合は,このソートは使えません.いちいち,新しく配列を作って,そこにコピーしてとかなりめんどくさいことになります.少し考えてみましょう.(10月28日失敗に終わる(T_T))
今日(10月29日),K先輩に話を聞いたところこのソートはかなり早いそうです!
![]()
| 実用性バツグンのソートプログラム |
さてさて,昨日失敗したソートプログラムができました!これは,かなり実用性があるのでは?と思います.早速いってみましょう!
/*実用性抜群ソートプログラム*/
import java.util.*;
/**メインクラス*/
public class NewSort
{
public static void main(String[ ] args){
ArrayList array = new ArrayList(10); //まずは,長さが10の入れ物を作る
for(int i=0; i<10; i++)
array.add(new Set((int)(Math.random()*10), i )); //その箱の中に,乱数(0〜9)をいれる.
Collections.sort(array, new MyComparator()); //ソートします.
Set set;
Iterator it = array.iterator(); //先頭から順に見ていきましょう.
while(it.hasNext()){
set = (Set)it.next();
System.out.println(set.x_ + " " + set.y_);
}
}
}
/**Comparatorインタフェースを実装して,ソート順を制御するクラス*/
class MyComparator implements Comparator
{
public int compare(Object o1, Object o2){
if(((Set)o1).x_ == ((Set)o2).x_)
return 0;
else if(((Set)o1).x_ > ((Set)o2).x_)
return 1;
else
return -1;
}
}
/**キャストに利用するクラス.それ以外の目的はない*/
class Set
{
int x_, y_;
Set(int x, int y){
x_ = x;
y_ = y;
}
}
実装の意味がわからない人には少し厳しいプログラムかもしれません.ポイントとしては,可変長配列であるArrayListを用いてソートが出来るというとこですね.ソートするときには,基本的に比較が必要ですよね?そのとき,オブジェクト同士を比較するのは無理なんです.そこで,Collections.sort(List list,Comparator c)を使っているわけです.()の中身は,List listはList型のオブジェクトをいれます.ArrayListはListインタフェースを実装しているので,List型にあてはまります(ここではarray).Comparator cは,Comparator型のオブジェクトをいれます.このComparatorでソートの制御を行うのですが,これはComparatorインタフェースを実装したMyComparatorというクラスを作って,compareメソッドを上書きしてあげます.これで,arrayはMyComparatorの制御に従い,ソートが行われるのです.ソートに関してはここで終わりです.これより後は,表示するためにIteratorを利用しています.これについては,次で説明します.
どうでしょうか?理解できますか?僕がこの説明をみても理解できるとは思いません・・・.もう少ししたら詳しく説明しますね.それまでお待ちあれ.
![]()
| AllayListクラス & Iteratorクラス |
さて,プログラムも慣れてくると配列も色々使いますね?でも,int[10]とかは配列の長さが決まっているから,あとからいじる時にすごい不便を感じます.そこで,可変長であるArrayListクラスを利用して見たいと思います.まずは,頭にimport java.util.ArrayList.;と記述しておきましょう.
工事中・・・