好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java自定义长度可变数组的操作

我们都知道数组是线性的、类型固定、内存地址连续、定长的,主要是数组一旦被定义,那么它的长度也就定下来了,只能添加有限的数据。而长度可变的数组是要将这个长度打破,实现数组数据无限增加

那么定义长度可变的数组就可以用两个数组来实现数组长度的变化。为了避免每次增加数据或删除数据时都要重新开辟空间,我先设定原数组为固定长,在当数组放满时,一次增加一定的长度,这样 节省了开辟空间的时间

因为数组里的数据类型是不确定的,所以用泛型比较好

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

public class MyList<E> {

  private int rongliang; //容量

  private int zengliang; //增量

  private int num; //数量

 

  //定义一个原数组

  //Object类包含所有的类型,所以定义数组是用Object类

  private Object[] src;

 

  //三个不同的构造方法

  public MyList(){

  this ( 10 , 10 );

  }

 

  public MyList( int rongliang){

  this (rongliang, 10 );

  }

 

  public MyList( int rongliang, int zengliang){

  this .rongliang = rongliang;

  this .zengliang = zengliang;

  src = new Object[rongliang];

  }

}

在MyList中实现在数组中添加数据,要考虑到数组中的数据数量小于数组长度时,可以直接在数组为null处添加数据,但当数组的数量大于等于数组长度时,要先重新定义一个数组,长度是原数组加增量,然后再添加数据

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

public void add(E s){

  //判断数组中的数据数量num是否大于数组的长度(容量),超出则需扩容

  if (num>=src.length){

  //定义一个新的数组,长度是原有的长度加增量

  Object arr[] = new Object[src.length+zengliang];

  //拷贝数组数据

  System.arraycopy(arr, 0 , arr, 0 , src.length);

  src = arr;

  }

  //如果num不大于数组的长度,则不需扩容,直接加入

  //如果num大于等于数组长度,则需执行上面的if语句扩容,再加入数据

  //最后num++

  src[num++] = s;

  }

取出指定下标的数据,因为传入的是下标的参数,所以要判断数组的下标是否越界,抛出异常

?

1

2

3

4

5

6

7

8

public E get( int index){

  //抛出异常

  if (index< 0 || index>=num){

  throw new IndexOutOfBoundsException( "下标越界!index:" +index+ ",size:" +num);

  }

  //强制转换成E类型

  return (E)src[index];

  }

修改指定下标的数据,因为传入的是下标的参数,所以要判断数组的下标是否越界,抛出异常

?

1

2

3

4

5

6

7

public void modify( int index,E s){

  //抛出异常

  if (index< 0 || index>=num){

  throw new IndexOutOfBoundsException( "下标越界!index:" +index+ ",size:" +num);

  }

  src[index] = s;

  }

删除指定下标的数据,当数组中null值的长度大于等于增量时,要将数组的容量减小,防止浪费

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public void delete( int index){

  //抛出异常

  if (index< 0 || index>=num){

  throw new IndexOutOfBoundsException( "下标越界!index:" +index+ ",size:" +num);

  }

  //将>index的数据依次向前移动一位

  System.arraycopy(src, index+ 1 , src, index, num-index- 1 );

  num--;

  //减少容量的方法

  if (src.length-num>=zengliang){

    //定义一个新的数组,长度是原先数组的长度减去增量

      Object arr[] = new Object[src.length-zengliang];

    //拷贝数组

      System.arraycopy(src, 0 , arr, 0 , num);

    src = arr;

  }

  }

将指定下标处的数据改为指定的数据

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

public void insert( int index,E s){

  //抛出异常

  if (index< 0 || index>=num){

  throw new IndexOutOfBoundsException( "下标越界!index:" +index+ ",size:" +num);

  }

  //判断数组中的数据数量num是否大于数组的长度(容量),超出则需扩容

  if (num>=src.length){

    //定义一个新的数组,长度是原有的长度加增量

    Object arr[] = new Object[src.length+zengliang];

    //拷贝数组数据

    System.arraycopy(src, 0 , arr, 0 , src.length);

    src = arr;

  }

  //将>index的数据依次向后移动一个位置

  //arraycopy()是可以将数据自己拷贝给自己

  System.arraycopy(src, index, src, index+ 1 , num-index);

  //插入数据

  src[index] = s;

  num++;

  }

最后在写个获取数组中数据的个数,而不是数组的长度

?

1

2

3

public int size(){

    return num;

  }

写个测试类,来测试这个长度可变的数组是否可行

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

public class test {

 

  public static void main(String[] args) {

  //创建一个MyList对象

  // 在创建对象时明确类型

  MyList<String> list = new MyList<String>();

 

  //添加数据

  list.add( "a" );

  list.add( "b" );

  list.add( "c" );

  list.add( "d" );

  list.add( "e" );

  list.add( "f" );

  list.add( "g" );

  list.add( "h" );

  list.add( "i" );

  list.add( "j" );

 

  //遍历数组

  for ( int i= 0 ;i<list.size();i++){

  String s = list.get(i);

  System.out.print(s+ " " );

  }

 

  System.out.println( "" );

  int n = list.size();

    System.out.println( "数据个数为:" +n);

  System.out.println( "**********************************************" );

 

  //修改指定位置的数据

  list.modify( 1 , "QQ" );

 

  //遍历数组

  for ( int i= 0 ;i<list.size();i++){

  String s = list.get(i);

  System.out.print(s+ " " );

  }

 

  System.out.println( "" );

  int m = list.size();

  System.out.println( "数据个数为:" +m);

  System.out.println( "**********************************************" );

 

  //删除指定位置的数据

  list.delete( 2 );

 

  //遍历数组

  for ( int i= 0 ;i<list.size();i++){

  String s = list.get(i);

  System.out.print(s+ " " );

  }

 

  System.out.println( "" );

    int k = list.size();

    System.out.println( "数据个数为:" +k);

  System.out.println( "**********************************************" );

 

  //在指定位置插入指定的数据

  list.insert( 3 , "zr" );

  list.insert( 3 , "qi" );

 

  //遍历数组

  for ( int i= 0 ;i<list.size();i++){

  String s = list.get(i);

  System.out.print(s+ " " );

  }

 

  System.out.println( "" );

  int h = list.size();

    System.out.println( "数据个数为:" +h);

  System.out.println( "**********************************************" );

  }

 

}

最终数组的结果为:

?

1

2

3

4

5

6

7

8

9

10

11

12

a b c d e f g h i j

数据个数为: 10

**********************************************

a QQ c d e f g h i j

数据个数为: 10

**********************************************

a QQ d e f g h i j

数据个数为: 9

**********************************************

a QQ d qi zr e f g h i j

数据个数为: 11

**********************************************

补充:在Java中创建一个自定义长度的数组并输入每个元素

用到知识点:数组、方法、Scanner、for循环。

作业:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

package Array;

import java.util.Scanner;

public class InputArray {

public static void main(String[] args) {

shuzu(); //方法调用

  }

  //方法定义

  public static void shuzu() {

 

  //将输入的数字作为数组的长度

  Scanner sz = new Scanner(System.in);

  System.out.println( "请输入数组长度:" ); //提示可以操作

  int [] cd = new int [sz.nextInt()]; //数组初始化完成

  System.out.println( "当前数组长度定义为:" +cd.length); //再提示一下结果

 

  //用for循环为每一个元素赋值

  for ( int i = 0 ; i < cd.length; i++) {

   int q = i+ 1 ; //这里q用作提示,避免提示出第0个元素。

   System.out.println( "请输入第" +q+ "个元素的值:" );

   cd [i] = sz.nextInt();

   System.out.println( "第" +q+ "个元素定义为" +cd[i]+ "。" );

   }

   sz.close();

  

   //数组内各元素已经完成赋值,但是再用for循环遍历一次

  System.out.print( "数组内元素全部完成赋值:" ); //继续提示一下

  for ( int i2 = 0 ; i2 < cd.length; i2++) { 

   if (i2 == cd.length- 1 ) {

   System.out.print(cd[i2]+ "。" );

   } else {

   System.out.print(cd[i2]+ "、" );

   }

  }

  return ; //方法结束,rentun;

  }

 

}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://blog.csdn.net/miss_rong/article/details/60967501

查看更多关于Java自定义长度可变数组的操作的详细内容...

  阅读:21次