第5章 数组与字符串
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
public static void main(String[] args) {
final int N=13, S=3, M=5;
int [] p=new int[N];
int [] q=new int[N];
p[k]=1;
int i,j,k,n=0;
q[n++]=k+1;
k=S-2;
//System.out.println((k+1)+" ");
数组名=new 数据类型[个数];//动态分配内存给数组
或者
数据类型[ ] 数组名= new 数据类型[个数];
x的类型是对一个int
例如:
数组对象的引用,x 是一个引用变量。
int[ ] x;
//声明名称为x的int型数组,未分配内存给数组
x = new int[10]; //x中包含有10个元素,并分配空间
false
克隆后数组元素是否相等:Arrays.equals(array1, array2):
true
元素3在array1中的位置:Arrays.binarySearch(array1, 3):
1
元素9在array1中的位置:Arrays.binarySearch(array1, 9):
-9
8
5.2 一维数组
–图5.2
数组和对象在没有引用变量指向它时,就会变成垃圾, 不被使用,但占内存,在随后不确定的时间释放。
4
5.1 数组的基本概念
• 数组的主要特点
–数组是相同数据类型的元素的集合; –数组中的各元素是有先后顺序的,它们在内存中按
照这个先后顺序连续存放在一起; –数组元素用整个数组的名字和它自己在数组中的顺
System.out.println("\nString array:");
for (String s : colors) {
System.out.print(s+" ");}
System.out.println("\nTwo dimension array");
for (int[] row : arrayAnother) {
–堆内存:存放由new运算符创建的对象和数组。 由Java虚拟机的自动垃圾回收器来管理。
3
5.1 数组的基本概念
• Java语言内存分配问题(续)
–引用变量:为数组或对象起的一个名称。在堆中创 建一个数组或对象后,还可在栈中定义一个引用变量 存放该数组或对象在堆内存中的首地址(对象的句 柄),以后就可在程序中使用栈的引用变量来访问堆 中的数组或对象。
– for (type elemefnotr (:inatrerlaeym)ent : arr)
–{
System.out.println(element);
–
Sy每st次em从.o数ut组.parrirnatyl中n(取el出em一en个t)元; 素,自
–
…动…赋给element,用户不用判断是否超
• 一维数组的定义
用户也可以改变数组x的值,让它指向另外一个数 组对象,或者不指向任何数组对象(如x=null; )。
• 定义时与C/C++区别
Java定义数组也可为”数据类型 数组名[](如: int x[])” ,但Java中并不为数组元素分配内存, 因此[]中不给数组长度(用new分配)。
9
5.2 一维数组
动态内存分配说明
用new分配内存的同时,数组的每个元素都会自动 赋默认值,整型为0,实数为0.0,布尔型为false, 引用型为null。
一维数组元素的访问
要想使用数组里的元素,可利用数组名和下标来 实现。
数组元素的引用方式为: 数组名[下标] 与C/C++不同的是,Java对数组元素要进行越界检
–
} 出了数组的长度。element的类型必须
与数组array中元素的类型相同。 18
foreach示例
public class ForeachTest {
public static void main(String[] args) {
int [] array={1,2,3,4,5,6};
String [] colors= {"red","blue","green","black","yellow"};
for (int element : row) {
System.out.print(element+" ");}
}}}
19
5.4 多维数组
二维数组(Java中无真正的多维数组,只是数组的数
组)
分配内存时,
声明和百度文库存分配: 数据类型[ ] [ ] 数组名;
必须指明行 和列的个数
数组名 = new 数据类型 [行数] [列数];
序位置来表示。例如,a[0]表示名字为a的数组中的 第一个元素,a[1]代表数组a的第二个元素,依次类 推。
5
5.2 一维数组
• 一维数组的定义
使用Java语言的数组,一般需经过三个步骤:一是 声明数组,二是创建空间,三是创建数组元素并赋
值。前两个步骤的语法如下:
数据类型[ ] 数组名;
//声明一维数组
–查找数组元素:通过binarySearch方法能 对排序好的数组进行二分查找法操作。
见TestArrays.java
7
填充数组:Arrays.fill(array, 5): TestArrays执行结果 55555
将数组的第2和第3个元素赋值为8:Arrays.fill(array, 2, 4, 8):
例5.3算法二分析
(3) 第3次循环 i=3 j= 1 2 3 4 5 k=12 0 1 2 3 此时p[3]=1 1 2 3 4 5 6 7 8 9 10 11 12 13 p[n] 0 0 0 1 0 0 1 0 0 0 0 1 0
q[n] 7 12 4 0 0 0 0 0 0 0 0 0 0 (4) 第4次循环 i=4
查。 ArrayIndexOutOfBoundsException
对于每个数组都有一个属性length指明它的长度, 如x.length指出数组x所包含的元素个数。
见例题5.1
10
5.2 一维数组
一维数组的初始化及应用
若在声明数组时进行赋值即初始化称为静态内存 分配。
数据类型[ ] 数组名={初值0,初值1,…,初值 n};
或 int[] x = new int[10]; //声明数组并动态分配内存
6
数组类Arrays 表5.1
• java.util.Arrays类能方便地操作数组, 它提供的所有方法都是静态的。具有以 下功能:
–给数组赋值:通过fill方法。
–对数组排序:通过sort方法,按升序。
–比较数组:通过equals方法比较数组中元 素值是否相等。
}
14
}
例5.3算法二分析
1 2 3 4 5 6 7 8 9 10 11 12 13 k=1(出圈人的下标) p[n] 0 0 0 0 0 0 0 0 0 0 0 0 0 p标识已出圈的人 q[n] 0 0 0 0 0 0 0 0 0 0 0 0 0 q存放出队顺序
(1) 第1次循环 i=1 j=1 2 3 4 5(1到M报数) k=2 3 4 5 6 此时p[6]=1 1 2 3 4 5 6 7 8 9 10 11 12 13 p[n] 0 0 0 0 0 0 1 0 0 0 0 0 0
j= 1 2 3 4 5 k=4 5 6(7) 8 9 此时p[9]=1
1 2 3 4 5 6 7 8 9 10 11 12 13 p[n] 0 0 0 1 0 0 1 0 0 1 0 1 0
q[n] 7 12 4 10 0 0 0 0 0 0 0 0 0
……
例5.3算法二
public class App5_3_1 {
int i=S-1,j,k=N,g=1;
int[] a=new int[N];
for(int h=1;h<=N;h++)
a[h-1]=h;
System.out.println("\n出圈的顺序为:");
N=13,S=3,M=5
do { i=i+(M-1);
1 2 3 4 5 6 7 8 9 10 11 12 13
for ( i = 1; i <=N; i++) {
}
for ( j = 1; j <=M; j++) { System.out.println("出队顺序为:");
if(k==N-1)
for ( i = 0; i < N; i++) {
k=0;
System.out.print(q[i]+" ");
如:int[] a = {1,2,3,4,5};
注意
在Java程序中声明数组时,无论用何种方式定义 数组,都不能指定其长度。使用new时才能指定11
例5.2
public class App5_2 { public static void main(String[] args)
{ int i,max,sec; int[] a={8,50,20,7,81,55,76,93}; if (a[0]>a[1]) { max=a[0]; sec=a[1]; } else { max=a[1]; sec=a[0]; }
}
System.out.print("\n其中的最大值是:"+max); System.out.println(" 次最大值是:"+sec);
}
}
13
例5.3算法一
public class App5_3
{ public static void main(String[] args)
{ final int N=13,S=3,M=5;
第5章 数组与字符串
主要内容
• 一维和多维数组的定义 • 数组元素的访问 • 字符串及应用
2
5.1 数组的基本概念
• 数组的概念
–相同数据类型的元素按一定顺序排列的集合。 Java中,数组元素可以为简单数据类型,也可以 为对象。
• Java语言内存分配问题
–栈内存:方法中定义的基本类型的变量和对象的 引用变量,超出作用域将自动释放。
while(i>=k) i=i-k;
1 2 3 4 5 6 8 9 10 11 12 13
System.out.print(" "+a[i]);
1 2 3 4 5 6 8 9 10 11 13
for(j=i;j<k-1;j++) a[j]=a[j+1];
k--; g++;
……
}while(g<=N);
else
}}}
k++;
if(p[k]==1) j--;
} 17
5.3 foreach语句与数组
foreach的语句:不用下标就可遍历整个数组。
foreach语句需提供元素类型、循环变量的名
字(用于存储连续的元素)和用于从中检索元
素的数组。 语法:
例如: int[ ] arr={1,2,3,4,5};
数据类型[ ] [ ] 数组名= new 数据类型 [行数][列数];
与C语言的区别 n列
n列
12 34 m行 5 6 7 8
int [][] arrayAnother={{1,2,3}, {4,5,6}, {7,8,9}};
System.out.println("Int array:"); for (int i : array) {
System.out.print(i+" ");}
for(int i=0;i<array.length;i++) System.out.print(array[i]+” ”);
55885
对数组的第2个到第6个元素进行排序进行排序:
Arrays.sort(array1,2,7):
7 8 2 3 3 6 12 5 4
对整个数组进行排序:Arrays.sort(array1):
2 3 3 4 5 6 7 8 12
比较数组元素是否相等:Arrays.equals(array, array1):
q[n] 7 0 0 0 0 0 0 0 0 0 0 0 0 (2) 第2次循环 i=2
j=1 2 3 4 5 k=7 8 9 10 11 此时p[11]=1
1 2 3 4 5 6 7 8 9 10 11 12 13 p[n] 0 0 0 0 0 0 1 0 0 0 0 1 0
q[n] 7 12 0 0 0 0 0 0 0 0 0 0 0
12
例5.2
System.out.print("数组的各元素为:"+a[0]+ " "+a[1]);
for(i=2;i<a.length;i++)
{ System.out.print(" " + a[i]);
if (a[i]>max)
{ sec=max;
max=a[i];
}
else
if (a[i]>sec) sec=a[i];