java学习笔记(4)

数组

一、论述

提到数组,我们必须先说下数据结构,所谓数据结构,是指由简单类型的数据构造符合类型数据的方法和表示。而数组就是基本数据结构之一,其是由类型相同、逻辑意义相关的一组数据构成的,而且它们分布在内存的一片连续的内存单元中,每个元素转移相同数目的单元。
和变量一样,数组必须先定义,后使用。定义数组时要确定数组的名称、数据类型,还要为它分配内存,初始化。在Java中,数组是对象。类Object中定义的方法都可以用于数组对象。基本类型,类类型,数组等。

1、一维数组

一维数组类似于数学中的向量,数组名就是指向数组首地址的指针

1.1 声明

数组声明基本形式为:
<存储类别><元素类别><数组名>[<元素个数>];
tips:存储类别默认为auto
数组元素表示形式为:
<数组名>[<下标表达式>]

1.2初始化

不赋值的话,默认初始化为0
静态初始化:在定义数组的同时对数组元素进行初始化

int intArray[ ]={1,2,3,4}; 
float [ ] heights = {84.124, 78.2, 61.5};
动态初始化是使用运算符new为数组分配空间。数组说明的方括号中的数字表示数组元素个数:

type[ ] arrayName = new type [arraySize]
type arrayName[ ] = new type [arraySize]

2、多维数组

多维数组可以看做数组的嵌套,即数组的数组,

2.1、多维数组的声明

声明的目的是指定数组名和元素的数据类型
多维数组在内存中“按行存放”,越往后的下表先变化,越靠前面的下标后变化。
二维数组的声明
类型标识符 数组名[ ] [ ]

类型标识符 [ ] [ ] 数组名

2.2、多维数组的初始化

初始化的目的是指定数组的行数与列数,为数组分配内存,给元素赋初值一般由赋值语句完成,也可以在初始化时通过初值表,同时完成赋初值的工作。
1. 先声明数组再初始化
类型标识符 数组名[ ] [ ]
数组名=new 类型标识符 [行数] [列数]
2. 声明的同时进行初始化
类型标识符 数组名[ ] [ ]=new 类型标识符[行数] [列数]

类型标识符 [ ] [ ] 数组名= new 类型标识符[行数] [列数]
3. 赋初值初始化数组
类型标识符 数组名[ ] [ ]={ {初值表},{初值表},…{初值表} }

3、数组的排序

3.1 选择排序

(Selection Sort)思路:
从所有的数中找出最小的一个,将其放在最前面;
接着在余下的数中找出最小的一个,将其放在第二位,
依次类推,数列由前往后逐渐成型,直到全部记录排序完毕。

package example;
import java.util.Scanner;
public class zhijiepaixu {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner scanner=new Scanner(System.in);
    System.out.println("请输入数组中有几个数");
    int n=scanner.nextInt();
    int a[]=new int[n];//声明并用new初始化
    System.out.println("请输入数组中的数");
    for(int i=0;i<n;i++){
        a[i]=scanner.nextInt();
    }
    for(int i=0;i<n;i++) {
        for(int j=i+1;j<n;j++) {//直接遍历未排序的部分找到最小的元素
            if(a[j]<a[i]) {
                int temp=0;
                temp=a[j];
                a[j]=a[i];
                a[i]=temp;
            }
        }
    }
    System.out.println("排序后的数组为:");
    for(int i=0;i<n;i++) {
        System.out.print(a[i]+" ");
    }
}

}

这里写图片描述

3.2 冒泡排序

思路
对相邻两个数进行比较,将较小的调到前面,两两比较一轮之后,最大的一个数被放置在最后;
接着从头开始重复执行以上操作,次大的数被放置在倒数第二位,
依次类推,数列由后往前逐渐成型。

package example;
import java.util.Scanner;
public class bubble_Sort {
public static void main(String[] args) {
            // TODO Auto-generated method stub
            Scanner scanner=new Scanner(System.in);
            System.out.println("请输入数组中有几个数");
            int n=scanner.nextInt();
            int a[]=new int[n];//声明并用new初始化
            System.out.println("请输入数组中的数");
            for(int i=0;i<n;i++){
                a[i]=scanner.nextInt();
            }
            for(int i=0;i<n-1;i++) {
                for(int j=0;j<n-1-i;j++) {//相邻的元素比较,小的数放前面
                    if(a[j]>a[j+1]) {
                        int temp=0;
                        temp=a[j];
                        a[j]=a[j+1];
                        a[j+1]=temp;
                    }
                }
            }
            System.out.println("排序后的数组为:");
            for(int i=0;i<n;i++) {
                System.out.print(a[i]+" ");
            }
}

}

这里写图片描述

3.1 快速排序

对冒泡排序的一种改进
基本思想:
通过一躺排序将数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小;
然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

4、字符串

4.1 概念

字符常量是用单引号括起来的一个字符,字符串就是双引号括起来的一串字符,不包括双引号,双引号是其起止标志符!
“”代表空串,含’\0’,

4.2 字符数组

字符串就是存储在字符数组中,因为’\0’的存在,数组长度为字符串长度加一。字符串可以在定义字符数组时作为初始化数据存入数组中,但不能通过复制表达式直接赋值。例如:

(1)char a[10]="array";//正确
(2)a="struct";//错误

当然,上面叙述的是C++中的字符串思想,Java中的字符串与之相比还有一定的区别,编译器可以令Java中字符串常量是进行共享的,一般认为Java中的字符串是不可变的,即不可修改字符串中的单个字符。C++中认为字符串是字符型数组,而Java中的字符串大致类似于char*指针。

greeting[]="Hello";//C++
char* greeting="Hello";//Java
4.3 字符串的输入输出

C++版的:

#define N 10
char w[N][30];
for(int i=0;i<N;i++)
    cin>>w[i];
for(int i=N-1;i>0;i--)
    cout<<w[i]<<endl;

数组中实际还是存的字符对应的ASCII码。

Java:
Scanner in = new Scanner(System.in);
System.out.print(“What is your name?”);
String name=in.nextLine();

二、题目

1. 编写一个程序,计算一维数组中最大值、最小值及其差值。

package xiti;
import java.util.Scanner;
public class xiti4_1 {
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner scanner=new Scanner(System.in);
    System.out.println("请输入数组中有几个数");
    int n=scanner.nextInt();
    int array[]=new int[n];//声明并用new初始化
    System.out.println("请输入数组中的数");
    int max,min,differ;
    for(int i=0;i<n;i++) {
        array[i]=scanner.nextInt();//输入这n个数
    }
    max=min=array[0];
    //选择排序思想
    for(int i=1;i<n;i++) {
        if(max<array[i]) {
            max=array[i];
        }
        if(min>array[i]) {
            min=array[i];
        }
    }
    differ=max-min;
    System.out.println("数组中最大数为:"+max);//输出最大数
    System.out.println("数组中最小数为:"+min);//输出最小数
    System.out.println("两者差值为:"+(max-min));//输出两者差值
}
}

这里写图片描述

2. 从键盘输入10个整数,放入一个一维数组,然后将前5个数与后5个数对换,即1与10,2与9,…5与6对换。

(提示:可以用Scanner类)

package xiti;
import java.util.Scanner;
public class xiti4_2 {
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner scanner=new Scanner(System.in);
    int array[]=new int[10];//声明并用new初始化
    System.out.println("请输入这10个数:");
    for(int i=0;i<10;i++) {
        array[i]=scanner.nextInt();//输入这10个数
    }
    System.out.println("交换位置前的数组如下:");
    for(int i=0;i<10;i++) {
        System.out.print(array[i]+" ");//输出这10个数交换前的次序
    }
    for(int i=0;i<5;i++) {
        int temp;//交换中间搭桥变量
        temp=array[i];
        array[i]=array[9-i];
        array[9-i]=temp;
    }
    System.out.println();
    System.out.println("交换位置后的数组如下:");
    for(int i=0;i<10;i++) {
        System.out.print(array[i]+" ");//输出这10个数交换后的次序
    }
}

}

这里写图片描述

3. 求10行、10列整型方阵对角线上元素之和。

package xiti;
import java.util.Scanner;
public class xiti4_3 {
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner scanner=new Scanner(System.in);
    int array[][]=new int[10][10];
    System.out.println("请按序输入该方阵元素:");//输入该方阵元素
    int sum=0;
    for(int i=0;i<10;i++) {
        for(int j=0;j<10;j++) {
            array[i][j]=scanner.nextInt();
            if(i==j) {//对角线元素判断,即横纵序列号相等的元素
                sum+=array[i][j];
            }
        }
    }
    System.out.println("该方阵对角线上的元素之和为:"+sum);//输出和
}

}

这里写图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李霁明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值