この記事はJavaとPythonを基礎から学びたい私のための Advent Calendar 2024の4日目の記事です。
配列について詳しく見ます。ざっくりとした説明はこちらからどうぞ。
配列について
たくさんの数値や数を入れることができるということを昨日学習しました。入れている数字や文字は「要素」と呼ばれているようです。0から順番に入れるのではなく、空いている場所に入れることができるようです。(入っていない場所はnullになるっぽい)
配列の宣言
空の配列を作るときは
String[] Hairetu=new String[2];
で行けました。ちなみに昨日はint型の配列でしたがこの通りString型の配列もできるようです。要素入りは下のほう。
int[] A={0,2,3,5,8};
要素の追加
用意した配列に、後から要素を追加することができるようです。
Hairetu[1]="Winter";
Hairetu[0]="December";
配列の、[ ]の中の数字の場所に入ります。
ただし、同じ場所(例えば[1])に2つ入れようとした場合、
Hairetu[1]="Winter";
Hairetu[1]="December";
この時は先に入れていた方が上書きされて消えてしまうようです。入れたい場所から後ろの部分をひとつづつずらして無理やりねじ込むことは普通にはできないようです。
配列をコピーする
二つ以上の配列があるときに、配列の中身をコピーすることができるようです。
System.arraycopy(B, 0, A, 0, A.length);
コピー元、コピー先の開始位置やコピーの長さを変えることができるのは便利そうです。
要素を並び替える
要素は並び替えられるみたいです.
import java.util.Arrays;
importが必要な点に注意。あとは
Arrays.sort(Hairetu);
sortを使うと文字を並び替えられるようです。
どうしても配列だけを使って要素をひとつだけ消したいとき
調べたところ、通常はlist型に変換して、必要な操作(今回は消す操作)してからまた配列に戻すといったことが必要なようです。
Hairetu[1]="Winter";
Hairetu[0]="December";
Hairetu[3]="Natuyasumi";//消したい
Hairetu[4]="Kotatu";
それでも、どうしてもListを使いたくない!という人がこの世のどこかに一人くらい入ると思います。そんな人のために、ここまで学んだ知識を生かして途中の要素を消すものを作ってみました。多分動きます。自分は動きました。
public class B {
public static void main(String[] args){
String[] Hairetu=new String[4];
String[] HairetuB=new String[Hairetu.length];
int DelNumber=0;
Hairetu[1]="Winter";
Hairetu[0]="December";
Hairetu[2]="Natuyasumi";//消したい
Hairetu[3]="Kotatu";
for(int i=0;i<Hairetu.length;i++){
if(i==2){
//消す
DelNumber++;
continue;
}
HairetuB[i-DelNumber]=Hairetu[i];
}
Hairetu=new String[HairetuB.length-DelNumber];
System.arraycopy(HairetuB, 0, Hairetu, 0, Hairetu.length);
for(String j:Hairetu){
System.out.println(j);
}
}
}
配列を二つ使ったやり方です。元の配列で2つ目が消したいときのやつです。
for文でコピー先にコピーしながら、コピーしたくないやつの処理を飛ばしています。飛ばしたままにするとnullが入ってしまうので、ずれた分を補正(今回は「DelNumber」という名前のint型)を使ってずれを補正しています。このままでもいいのですが、最後に元の配列の長さを今の長さに戻して入れなおしています。
こんな感じでも行けます。が、おとなしくListを使った方がいいような気もします。
ちなみに、頑張れば要素を上書きされずに一つずつずらしながらねじ込むこともできそうです。
まとめ
配列は空いている場所に要素を入れることはできるが、空いていないと入れるのは難しい。また、消すのも簡単ではな。ただ、コピーはできるし、Listに変換もできるため、いざとなったら変換していい感じに使えばいい。
参考文献