配列
基本知識
コンセプト:
配列は、同じ型のデータのセットを格納できるプログラミング言語の一般的なデータ構造です。
機能:
数学的統計に便利な同種データの集合(最大値、最小値、平均値、合計)を保存し、情報を表示します。
意味:
public class study {
public static void main(String[] args) {
//1
byte[] bytes = new byte[]{
1,2,3,4,5};
//2
int[] numbers = {
1,2,3,4,5};
}
}
最初:
- 配列の定義と値の代入を同時に行う場合にのみ使用できます
2 番目のタイプ:
- 配列を定義するときに直接使用することも、最初に定義してから使用するように割り当てることもできます。
配列内のデフォルト値:
- 倍精度浮動小数点数の配列のデフォルト値は0.0です。
- 単精度浮動小数点数の配列のデフォルト値は0.0fです。
- ブール型配列のデフォルト要素はfalseです
- char 型配列のデフォルトの要素は '\u0000' です
- 整数配列のデフォルト値は0 です
基本要素:
配列演算
配列トラバーサル:
配列内のすべての要素を確認します。
配列の長さ --> array.length
public class study {
public static void main(String[] args) {
int[] arr1 = {
1,2,3,4,5};
for(int i=0;i<arr1.length;i++){
System.out.println(arr1[i]);
}
}
}
配列変更操作:
ケース:
既存の配列 10、12、17、32、39、50。配列内の 3 で割り切れるすべての要素を 2 乗し、要素をその位置に戻す必要があります。
public class study {
public static void main(String[] args) {
int[] arr1 = {
10,12,17,32,39,50};
for(int i=0;i<arr1.length;i++){
if(arr1[i]%3==0){
arr1[i] *= arr1[i];
}
}
}
}
配列の加算操作の
場合:
ある航空券代理店で、A、B、C、D、Eの4人がチケットを買うために並んでいるのですが、Bの親友Fも今チケットを買うために並んでいるのを見つけました。 B がキューに登録しているため、B の列にジャンプします。その後、配列に関する関連知識を使用してプログラム設計を完了してください。
public class study {
public static void main(String[] args) {
String[] arr = {
"A","B","C","D","E"};
//A B C D E
//A B F C D E
String[] new_arr = new String[arr.length+1];
int co = 2;
for(int i=0;i<co;i++){
new_arr[i]=arr[i];
}
new_arr[co]="F";
for(int j=co;j<new_arr.length;j++){
new_arr[j+1]=arr[j];
}
arr = new_arr;
for(int m=0;m<arr.length;m++){
System.out.println(arr[m]);
}
}
}
配列削除操作の
ケース 1:
前のケースでは、チケット購入者 C が何らかの理由で退出し、キューにいた人が 1 人減りました。配列に関する関連知識を使用してプログラム設計を完了してください。
public class study {
public static void main(String[] args) {
String[] arr = {
"A","B","C","D","E"};
//A B C D E
//A B D E
String[] new_arr = new String[arr.length-1];
for(int i=0;i<2;i++){
new_arr[i]=arr[i];
}
for(int j=3;j<arr.length;j++){
new_arr[j-1]=arr[j];
}
arr = new_arr;
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
配列のコピー
文法:
System.arraycopy(原数组,拷贝的开始位置,目标数组,存放的开始位置,拷贝的元素个数);
このようにして、上記の質問の for ループのコピーをこの構文操作に置き換えることができます。
String[] arr = {
"A","B","C","D","E"};
//A B C D E
//A B D E
String[] new_arr = new String[arr.length-1];
for(int i=0;i<2;i++){
new_arr[i]=arr[i];
}
for ループは次のように置き換えられます。
System.arraycopy(arr,0,new_arr,0,2);
配列の拡張
文法:
数据类型[] 标识符 = Arrays.copyof(原数组,新数组的长度);
例:
import java.util.Arrays;
public class study {
public static void main(String[] args) {
String[] arr = {
"A","B","C","D","E"};
//A B C D E
//A B C D E F
String[] new_arr = Arrays.copyOf(arr,arr.length+1);
}
}
2 つの配列の練習
配列ソート
配列内の要素は、小さいものから大きいもの、または大きいものから小さいものの順に配置されます。昇順と降順に分かれています
バブルソート:
- 配列を走査するたびに、配列の要素から最大値(最大値、最小値)を取得できます。
- 毎回配列を走査するときに、配列内の 2 つの隣接する要素のサイズを比較し、配置要件に従って位置を交換します。
例:
10,70,55,80,25,60 を降順に並べる
public class study {
public static void main(String[] args) {
int[] arr = {
10,70,55,80,25,60};
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr.length-i-1;j++){
if(arr[j]<arr[j+1]){
int temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
for(int j=0;j<arr.length;j++){
System.out.println(arr[j]);
}
}
}
ツールの並べ替え操作:
構文:
Arrays.sort(数组名);//将数组中的元素进行升序排列
Arrays.toString(数组名)//将数组中的元素组装成一个字符串
ノート:
文字を並べ替えたり、辞書の順序に従って並べ替えたりすることができます (abcdefg...)
import java.util.Arrays;
public class study {
public static void main(String[] args) {
String[] names = {
"zhangsan","zhangsi","lisi","lisan",
"lisiabc","lisib"};
Arrays.sort(names);
System.out.println(Arrays.toString(names));
}
}
[リサン、リシ、リシアABC、リシブ、ジャンサン、ジャンシ]
二分探索
半探索とも呼ばれ、その名の通り、毎回途中から2つの区間に分割し、真ん中の要素を使って検索対象の要素の大きさを比較し、目的の要素が存在する区間を決定します。位置が特定され、要素を決定するために範囲が縮小されます。
二分検索はソートされた配列でのみ機能します
ケース:
シーケンス 95、93、87、86、79、72、60、53 から要素 60 の位置をすばやく見つけます。
public class study {
public static void main(String[] args) {
int[] numbers = {
95,93,87,86,79,72,60,53};
int target = 60;
int start =0;
int end = numbers.length -1;
while(start<end){
int mid = (start+end)/2;
if(numbers[mid]>target)
{
start = mid;
}else if(numbers[mid]<target){
end = mid;
}else{
System.out.println(mid);
break;
}
}
}
}
二次元配列
配列は本質的に 1 次元であり、2 次元配列とは 1 次元配列に 1 次元配列を加算することを指します。3次元配列、4次元配列など。
2 次元配列の定義:
数据类型[][] 数组名 = new 数据类型[数组的长度][数组的长度]
例: 長さ 5 の 2 次元配列を定義します。各スペースには任意の長さの double 配列のみを格納できます。2 は
空白のままにすることもできます。つまり、任意の長さの配列を格納できます。
public class study {
public static void main(String[] args) {
double[][] as = new double[5][];
as[0] = new double[]{
12,66};
as[1] = new double[]{
17,91};
as[2] = new double[]{
15,84};
as[3] = new double[]{
14,67};
as[4] = new double[]{
19,86};
}
}
ケース 1:
本体から 5 つの音楽情報 (名前、歌手、出版年月を含む) を記録し、配列に格納する
import java.util.Scanner;
public class study {
public static void main(String[] args) {
String[][] music_a = new String[5][3];
Scanner sc = new Scanner(System.in);
for (int i=0;i<music_a.length;i++){
System.out.println("请输入名称:");
String name = sc.next();
System.out.println("请输入歌手:");
String singer = sc.next();
System.out.println("请输入出版年月:");
String date = sc.next();
music_a[i] = new String[]{
name,singer,date};
}
}
}
ケース2:
ある学校の1年生は3クラスあり、1クラス10名、2クラス8名、3クラス7名の学年と年齢を入力するようになりました。これら 3 つのクラスの生徒をコンソールから取得し、各クラスの平均成績と平均年齢を計算します。
import java.util.Scanner;
public class study {
public static void main(String[] args) {
double[][][] stu_cal = new double[3][][];
stu_cal[0] = new double[10][2];
stu_cal[1] = new double[8][2];
stu_cal[2] = new double[7][2];
Scanner sc = new Scanner(System.in);
//录入数据
for(int i=0;i<stu_cal.length;i++){
double[][] ne_cal = stu_cal[i];
for(int j=0;j<stu_cal[i].length;j++){
System.out.println("请输入年龄:");
int age = sc.nextInt();
System.out.println("请输入成绩:");
double score = sc.nextDouble();
ne_cal[j] = new double[]{
age,score};
}
}
//查看数据,并计算平均值
for(int i=0;i<stu_cal.length;i++){
double tolage = 0,tolscore = 0;
double[][] ne_cal = stu_cal[i];
for(int j=0;j<ne_cal.length;j++){
tolage += ne_cal[j][0];
tolscore += ne_cal[j][1];
}
System.out.println("第"+(i+1)+"个班的平均年龄为"+(tolage/ne_cal.length));
System.out.println("第"+(i+1)+"个班的平均成绩为"+(tolscore/ne_cal.length));
}
}
}