一、数组的基本使用
int [ ] arr1 = new int [ 3 ] ;
int [ ] arr2 = new int [ ] { 10 , 20 , 30 } ;
int len1 = arr1. length;
int len2 = arr2. length;
System. out. println ( "arr1的长度是" + len1) ;
System. out. println ( "arr2的长度是" + len2) ;
System. out. println ( arr1[ 2 ] ) ;
System. out. println ( arr2[ 2 ] ) ;
arr1[ 0 ] = 99 ;
arr1[ 1 ] = 98 ;
arr1[ 2 ] = 97 ;
for ( int x: arr1) {
System. out. println ( x) ;
}
由此可见,数组被创造出来后,长度一定是被锁死的,所以我们需要解决数组长度不可变的问题:说白了就是用长度+1新数组替换掉旧数组
int [ ] arr = new int [ ] { 1 , 2 , 3 } ;
System. out. println ( Arrays. toString ( arr) ) ;
int dst = 4 ;
int [ ] newArr = new int [ arr. length+ 1 ] ;
for ( int i= 0 ; i< arr. length; i++ ) {
newArr[ i] = arr[ i] ;
}
newArr[ newArr. length- 1 ] = dst;
arr= newArr;
System. out. println ( Arrays. toString ( arr) ) ;
同样的如果想删除数组中的某个元素,也是要创建一个长度-1新数组替换掉旧数组
int [ ] arr = new int [ ] { 1 , 2 , 3 , 4 , 5 } ;
System. out. println ( Arrays. toString ( arr) ) ;
int dst = 2 ;
int [ ] newArr = new int [ arr. length- 1 ] ;
for ( int i= 0 ; i< newArr. length; i++ ) {
if ( i< 2 ) {
newArr[ i] = arr[ i] ;
} else {
newArr[ i] = arr[ i+ 1 ] ;
}
}
arr= newArr;
System. out. println ( Arrays. toString ( arr) ) ;
二、面向对象的数组
面向对象的数组是指把数组放在一个对象中,那么我们就可以通过对对象方法的调用实现对数据的管理
public class TestArray4Util {
private int [ ] elements;
public TestArray4Util ( ) {
elements = new int [ 0 ] ;
}
public int size ( ) {
return elements. length;
}
public void show ( ) {
System. out. println ( Arrays. toString ( elements) ) ;
}
public void add ( int element) {
int [ ] newArr = new int [ elements. length+ 1 ] ;
for ( int i = 0 ; i < elements. length; i++ ) {
newArr[ i] = elements[ i] ;
}
newArr[ newArr. length- 1 ] = element;
elements = newArr;
}
public void delete ( int index) {
if ( index < 0 || index > elements. length- 1 ) {
throw new RuntimeException ( "下标越界" ) ;
}
int [ ] newArr = new int [ elements. length- 1 ] ;
for ( int i = 0 ; i < newArr. length ; i++ ) {
if ( i< index) {
newArr[ i] = elements[ i] ;
} else {
newArr[ i] = elements[ i+ 1 ] ;
}
}
elements = newArr;
}
public void insert ( int index, int element) {
if ( index < 0 || index > elements. length- 1 ) {
throw new RuntimeException ( "下标越界" ) ;
}
int [ ] newArr = new int [ elements. length+ 1 ] ;
for ( int i = 0 ; i < elements. length; i++ ) {
if ( i< index) {
newArr[ i] = elements[ i] ;
} else {
newArr[ i+ 1 ] = elements[ i] ;
}
}
newArr[ index] = element;
elements = newArr;
}
public void set ( int index, int element) {
if ( index < 0 || index > elements. length- 1 ) {
throw new RuntimeException ( "下标越界" ) ;
}
elements[ index] = element;
}
public int get ( int index) {
if ( index < 0 || index > elements. length- 1 ) {
throw new RuntimeException ( "下标越界" ) ;
}
return elements[ index] ;
}
}
三、查找算法之线性查找
线性查找就是给你一个元素,你在数组中顺序查找是否有该元素存在,如果有,则显示下标,如果没有,则显示-1
int [ ] arr = new int [ ] { 10 , 20 , 30 , 40 , 50 } ;
int target = 30 ;
for ( int i = 0 ; i < arr. length; i++ ) {
if ( target == arr[ i] ) {
System. out. println ( i) ;
} else {
return - 1 ;
}
}
四、查找算法之二分法查找
二分法显而易见,先从中间开始找,将数组分成两份,若是中间的元素比目标元素大,那么只需要找前半段,反之则只需要找后半段,后面步骤同理,知道找处结果,因此二分法查找的使用是有条件的:即数组必须是顺序数组。
int [ ] arr = new int [ ] { 10 , 20 , 30 , 40 , 50 , 60 , 70 , 80 , 90 } ;
int begin = 0 ;
int end = arr. length- 1 ;
int mid = ( begin+ end) / 2 ;
int target = 50 ;
int index = - 1 ;
while ( true ) {
if ( begin>= end) {
break ;
}
if ( target == arr[ mid] ) {
index = mid;
break ;
} else {
if ( target< arr[ mid] ) {
end = mid - 1 ;
} else {
begin = mid + 1 ;
}
mid = ( begin+ end) / 2 ;
}
}
System. out. println ( index) ;