数组
一、论述
提到数组,我们必须先说下数据结构,所谓数据结构,是指由简单类型的数据构造符合类型数据的方法和表示。而数组就是基本数据结构之一,其是由类型相同、逻辑意义相关的一组数据构成的,而且它们分布在内存的一片连续的内存单元中,每个元素转移相同数目的单元。
和变量一样,数组必须先定义,后使用。定义数组时要确定数组的名称、数据类型,还要为它分配内存,初始化。在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);//输出和
}
}