数组特点:1.固定长度 2. 元素都有索引
什么时候使用数组(容器)呢?
数据多了,必须先进行存储,然后进行操作。
对于数组容器什么时候用呢?
数据多,个数确定,而且有对应关系
在分析需求时:
1.需求中的数据是否有对应的有序编号?
2.需求中的数据是否需要有序的编号?
如果有,就用数组存储。
例1:一组数: 34,89,12,70,45 要对他们进行操作,需要编号,操作更容易。
另一组数: 100,101,102,103 就不需要编号
例2: 根据用户输入的数据,显示对应的星期 用 switch,if 方法什么的不说了。。
思路:
1.星期有多个,个数固定。
2.星期都由对应的有序编号。
所以可以使用数组这种结构进行存储
定义一个功能,根据给定的数据获取对应的星期。
(重点是思想)
(代码什马的都不重要)
查表法:数据之间存在对应的关系,通过关系中的一方查询另一方。
当对应关系存在,但没有一方是有序编号时,使用另一个容器,map
public static String getWeek(int num){
if(num>7||num<1)
return num+"没有对应的星期";
//1.定义一个数组,存储对应的星期数,这个称之为存储了一个对应关系的表。
String[] weeks = {"","星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
//根据指定的索引查表
return weeks[num]
}
配上个图(一维数组的内存图解):
数组定义的图解:
给数组赋值时的内存图解:
注:sop是System.out.println的意思。
改变数组的地址指向的图解:
因为数组是引用型数据类型,所以arr,xxx中存储的实际上是堆内存中数组实体的地址,当arr=xxx时,arr就不会指向0x0023而是指向0x0078,所以0x0023处的数组实体就成为了垃圾,JAVA中的垃圾回收机制会不定时的处理这些堆内存中的垃圾,防止内存溢出。
练习题:
1.
对一个给定的数组进行翻转
{23,14,88,5}-->
{5,88,14,23}
class Demo
{
public static void main(String args[]){
int [] = {23,14,88,5};
for(int start=0,end = arr.length-1;start < end;start++,end--){
swap(arr,start,end);
}
}
public static void swap(int [] arr,int a,int b){
arr[a] = arr[a] ^ arr[b];
arr[b] = arr[a] ^ arr[b];
arr[a] = arr[a] ^ arr[b];
}
}
2.
/*
思考题:
需求:如果往有序的数组中插入一个元素并继续保证有序,如何获取该位置?
思路:
1.既然是有序的数组,而且是找位置,必须要想到<span style="color:#ff0000;">二分查找法</span>
*/
import java.util.Arrays;
class Demo
{
public static void main(String args[]){
int[] arr = {9,13,25,29,45,46,88,99};
int index = binarySearch2(arr,7);
//int index2 = Arrays.binarySearch(arr,7);
//JAVA自带的二分查找方法,若存在该数,则返回角标
//不存在则返回一个负数,该负数取正再减1就是插入点
System.out.println("index="+index);
//System.out.println("index2="+index);
}
public static int binarySearch2(int[] arr,int key){
//1.定义三个变量,记录头角标,尾角标,中间角标
int max,min,mid;
min = 0;
max = arr.length-1;
while(min<=max){
mid = (max+min)>>1;
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
else
return mid;
}
return min;
}
}
获取插入点后剩余的部分就好处理了,这里就不多讲了,重新定义一个数组(比原数组长度多一),插入点之前的原样插入,插入点处插入要求的数据,后面的数据顺延即可。
又到了凌晨,╮(╯▽╰)╭唉,悲催的程序猿...
看会奥运会吧