JavaSE 一维数组

数组

提示:一旦数组被创建,它的大小是固定的。使用一个数组引用变量,通过下标来访问数组中的元素。

数组的声明

为了在程序中使用数组,必须声明一个引用数组的变量,并指明数组的元索类型。下面 是声明数组变量的语法:
elementType[] arrayRefVar; (元素类型口数组引用变量;)
elementType 可以是任意数据类型,但是数组中所有的元素都必须具有相同的数据类 型。例如:
下面的代码声明变量 myList,它引用一个具有 double 型元素的数组。
double[] myList;

数组的创建

不同于基本数据类型变量的声明,声明一个数组变量时并不在内存中给数组分配任何空 间。它只是创建一个对数组的引用的存储位置。如果变量不包含对数组的引用,那么这个 变量的值为 null。除非数组已经被创建,否则不能给它分配任何元素。声明数组变量之后, 可以使用下面的语法用 new 操作符创建数组,并且将它的引用赋给一个变量:

arrayRefVar = new e1ementType[arrayS1ze]:  

这条语句做了两件事情:
1 ) 使用 new elementType[arrayS"ize]创建了一个数组;
2) 把这个新创建的数组的引用赋值给变暈 arrayRefVar。
声明一个数组变量、创建数组、然后将数组引用賦值给变量这三个步驟可以合并在一条 语句里,如下所示:

elementType[] arrayRefVar = new elementType[arraySize]; 
(元素类型[]数组引用变量 =new 元素类型[ 数组大小]; ) 

elementType arrayRefVar[] = new e1ementType[arraySize]; 
(元素类型数组引用变量 =new 元素类型[数组大小]; ) 
数组大小和默认值

当给数组分配空间时,必须指定该数组能够存储的元素个数,从而确定数组大小。创 建数组之后就不能再修改它的大小。可以使用 arrayRefVar.length 得到数组的大小。例如: myList.length 为 10。 当创建数组后,它的元素被赋予默认值,数值型基本数据类型的默认值为 0,,boolean 型的默认值为 false

访问数组元素

数组元素可以通过下标访问。数组下标是基于 0的,也就是说,其范围从 0 开始到 arrayRefVar.length-1结束。

处理数组

处理数组 处理数组元素时,经常会用到 for 循环,理由有以下两点:
1 ) 数组中所有元素都是同一类型的。可以使用循环以同样的方式反复处理这些元素。
2 )由于数组的大小是已知的,所以很自然地就使用for循环。
假设创建如下数组:

 doubled myList-new double[10]: 

下面是一些处理数组的例子:
1 ) (使用输入值初始化数组)下面的循环使用用户输人的数值初始化数组 myList。java.util.Scanner input = new

java.util.Scanner(System.in); 
System.out.print("Enter " + myList.length + " values: "); 
 	for (int i = 0;i < myList.length;i++) {
		 myList[i] = input.nextDouble();
	}

2)(使用随机数初始化数组)下面的循环使用0.0 到 100.0之间,但小于100.0的随机 值初始化数组 myList。

 for (int i = 0;i < myList.length;i++){ 
 	myList[i] = Math.random() * 100;
 }

3 ) (显示数组)为了打印数组,必须使用类似下面的循环,打印数组中的每一个元素。

for (Int i = 0;i < myList.length; i++){ 
	System.out.print(myList[1] + " ");
}

4)(对所有元素求和)使用名为 total 的变量存储和。total 的值初始化为 0。使用如下 循环将数组中的每个元素加到 total 中:

double total= 0; 
for (Int i=0;i < myList.length;i++){ 
 total += myL1st[1]; 
} 

5)(找出最大元素)使用名为 max的变量存储最大元素。将 max的值初始化为 myList[0]。 为了找出数组 myList中的最大元素,将每个元素与 max 比较,如果该元索大于 max, 则更新 max。

double max= myList[0]; 
for (int i = 1;i < myList.length;i++){ 
 if (myList[i] > max) {
		max = myList[i];
 	}
 }

6 )(找出最大元素的最小下标值)经常需要找出数组中的最大元素。如果数组中含有 多个最大元素,那么找出最大元素的最小下标值。假设数组 myList 为{1,5, 3,4,S,S}。最大元素为 5, S 的最小下标为1。使用名为 max 的变量存储最大元素,使用名为 indexOfMax 的变量表示最大元素的下标。将 max的值初始化为 myList[0], 而将 indexOfMax 的值初 始化为 0。将 myList中的每个元素与 max比较,如果这个元素大于 max,则更新 max 和 indexOfMax。

7)(随机打乱)在很多应用程序中,需要对数组中的元素进行任意的重新排序。这称作 打乱(shuffling)。为完成这种功能,针对每个元素 myList[i], 随意产生一个下标 j, 然后 将 myList[i]和 myList[j]互换,如下所示:

for (int i= myList.length - 1; i > 0; i-- ) { 
	int j = (int)(Math.random() * (i + 1));
	double temp = myList[i]; 
	myList[i] = myList[j]; 
	myList[j] = temp;
}

8)(移动元素)有时候需要向左或向右移动元素。这里的例子就是将元素向左移动一个 位置并且将第一个元素放在最后一个元素的位置:

double temp = myList[0];
for (int i = 1; i < myList.length; i++) {
	myList[i - 1] = myList[i]; 
}
myList[myList.length - 1] = temp; 

9)( 简化编码)对于某些任务来说,数组可以极大简化编码。例如,假设你想通过给定数 字的月份来获得一个该月份的英文名字。如果月份名称保存在一个数组中,给定月份的月份 名可以简单通过下标获得。下面的代码提示用户输人一个月份数字,然后显示它的月份名称:

String[] months = {"January" , "February", •••, "December"}; 
System.out.print("Enter a month number (1 to 12): "); 
int monthNumber = input.nextlnt(); 
System.out.println("The month is + months[monthNumber - 1]); 
foreach 循环

Java 支持一个简便的 for 循环,称为 foreach 循环,即不使用下标变量就可以顺序地遍 历整个数组。例如,下面的代码就可以显示数组 myList 的所有元素:

for (double e: myList) { 
	System.out.println(e); 
} 

警告:越界访问數组是经常会出现的程序设计错误,它会抛出一个运行播误 ArraylndexOut OfBoundsException。为 了 避 免 错 误 的 发 生,在 使 用 时 应 确 保 所 使 用 的 下 标 不 超 过 arrayRefVar.length-1。 程序员经常错误地使用下标1幻用數组的第一个元素,但其实第一个元素的下标应该是 0。这称为下标过 1 错误(off-by-one error)

数组的复制

要将一个数组中的内容复制到另外一个中,需要将数组的每个元素复制到另外一个数组中。如:
list2=list1;
该语句并不能将list引用的数据内容复制给list2,而只是将list1的引用值复制给了list2.在这条语句之后,list1 和list2都指向同一个数组。list2原先所引用的数组不能再引用,他就变成了垃圾,会被Java虚拟机自动回收(这个过程成为垃圾回收)。
在Java中,可以使用赋值语句复制基本数据类型的变量,但不能复制数组。将一个数组变量赋值给另一个数组变量,实际上是将一个数组的引用复制给另一个变量,使两个变量都指向相同的内存地址。
复制数组有三种方法:
(1)使用循环语句逐个地复制数组的元素。
(2)使用System类中的静态方法arraycopy。
(3)使用clone方法复制数组。
可以使用循环将源数组中的每个元素复制到目标数组中的对应元素。例如,下述代码使用for循环将sourceArray复制到targetArray:
一种方式是使用java.lang.System类的arraycopy方法复制数组

arraycopy(sourceArray,srcPos,targetArray,tarPos,length);

其中,参数srcPos和tarPos分别表示在源数组sourceArray和目标数组targetArray中的起始位置。从sourceArray复制到targetArray中的元素个数由参数length指定。例如,可以使用下面的语句改写上述循环:

System.arraycopy(sourceArray,0,targetArray,0,sourceArray.length);

arraycopy方法没有给目标数组分配内存空间。复制前必须创建目标数组以及分配给它的内存空间。复制完后,sourceArray和targetArray具有相同的内容,但占有独立的内存空间。
注意:arraycopy方法违背了Java命名习惯。根据命名习惯,该方法应该命名为arrayCopy(即字母C大写)。

可变长参数列表

具有同样类型的可变长度的参数可以传递给方法,并将作为数组对待。
可以把类型相同但个数可变的参数传递给方法。方法中的参数声明如下:
typeName…parameterName(类型名…参数名)
在方法声明中,指定类型后紧跟着省略号(…)。只能给方法中指定一个可变长参数,同时该参数必须是最后一个参数。任何常规参数必须在它之前。
Java将可变长参数当成数组对待。可以将一个数组或数目可变的参数传递给可变长参数。当用数目可变的参数调用方法时,Java会创建一个数组并把参数传给它。

数组的查找

如果一个数组拍好序了,对于寻找数组中的一个元素,二分查找比线性查找更加高效。 查找是在数组中寻找特定元素的过程,例如:判断某一特定分数是否包括在成绩列表中。查找是计算机程序设计中经常要完成的任务。有很多用于查找的算法和数据结构。线性查找(linear searching)和二分查找(binary searching)。
7.1 线性查找法
线性查找法将要查找的关键字key与数组中的元素逐个进行比较。这个过程持续到在列表中找到与关键字匹配的元素,或者查完列表也没有找到关键字为止。如果匹配成功,线性查找返回与关键字匹配的元素在数组中的下标。如果没有匹配成功,则返回-1.
线性查找法把关键字和数组中的每一个元素进行比较。由于线性查找法的执行时间随着数组元素个数的增长而线性增长,所以,对于大数组而言,线性查找法的效率并不高。
7.2二分查找法
二分查找法是另一种常见的对数值列表的查找方法。使用二分查找法的前提条件是数组中的元素必须已经拍好序。假设数组已经按升序排列。二分查找法首先将关键字与数组的中间元素进行比较。考虑下面三种情况:
(1)如果关键字小于中间元素,只需要在数组的前一半元素中继续查找关键字。
(2)如果关键字和中间元素相等,则匹配成功,查找结束。
(3)如果关键字大于中间元素,只需要在数组的后一般元素中继续查找关键字。

排序

冒泡排序

在片描述

选择排序

在这里插入图片描述

插入排序

import java.util.Arrays;
public class Sort {
 public static void main(String[] args) {
  int[] a={3,1,0,5,7,6,4,2,9,8};//从小到大
//  bubbleSort(a);//O(n^2)
//  selectSort(a);//O(n^2)
  insertSort(a);//O(logn)
  /* n=1
   * 从第n张牌开始
   *  判断左边是否有牌
   *    有牌
   *   大于 换
   *    再次判断此牌左边是否有牌
   *     ....
   *   小于 n++
   *   没牌
   *      n++
   * */
 }
 private static void insertSort(int[] a) {
  int temp=0;
  for(int i=1;i<a.length;i++){
   int e=a[i];
   int j;
   for(j=i;j>0&&a[j-1]>e;j--){
    a[j]=a[j-1];
   }
   a[j]=e;
  }
  System.out.println(Arrays.toString(a));
 }
 private static void selectSort(int[] a) {
  for(int i=0;i<a.length-1;i++){
   for(int j=i+1;j<a.length;j++){
    if(a[i]>a[j]){
     a[i]=a[i]+a[j];
     a[j]=a[i]-a[j];
     a[i]=a[i]-a[j];
    }
   }
  }
  System.out.println(Arrays.toString(a));
 }
 public static void bubbleSort(int[] a){
  for(int i=0;i<a.length-1;i++){
   for(int j=0;j<a.length-1-i;j++){
    if(a[j]>a[j+1]){
     a[j]=a[j]+a[j+1];
     a[j+1]=a[j]-a[j+1];
     a[j]=a[j]-a[j+1];
    }
   }
  }
  System.out.println(Arrays.toString(a));
 }
}

猜你喜欢

转载自blog.csdn.net/qq_42393388/article/details/83539846
今日推荐