Java程序设计基础->数组(二)
作者:强哥   类别:Java开发    日期:2018-06-29 14:57:56    阅读:2487 次   消耗积分:0 分





注:本节教材内容,与上期推送的《预备知识:Java程序设计基础->数组(一)》为一个章节。

回顾上节内容,请点击:原理:预备知识:Java程序设计基础->数组(一)



实验流程



5.冒泡序算法。


数组排序最常用的两种排序方法是选择排序和冒泡排序。


(1).冒泡排序:依次比较相邻的两个数,将小数放在前面,大数放在后面。

(2).选择排序:每一次从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序数列的最后,直到全部待排序的数据元素排完。

 

我们以冒泡排序算法来给大家举例说明:假定有一个数组为int[] a = {12, 34, 23, 56, 69, 38, 47};则冒泡排序按如下顺序进行:


(1).第一轮:比较12和34,位置不变,比较34和23,交换位置,比较34和56,位置不变。这样完成第一轮后我们可以将本数组中的最大值69的位置放到数组的最后。完成这一轮后,数  组的顺序变为:{12,23,34,56,38,47,69}。

(2).第二轮:比较12和23,位置不变,比较23和34,位置不变,比较34和56,位置不变,比较56和38,位置交换,最后将本轮的次大值56放在了数组倒数第2的位置上。

(3).第三轮:以此类推,最后将数组的值按从小到大的顺序排列。当然,我们也可以将数组的值从大到小排列,其原理是一样的,只要在两两比较时将小值交换到后面即可。下列代码为大家演示了冒泡排序算法的具体实现,务必认真理解。


int[] a = {12, 34, 23, 56, 69, 38, 47};

//外循环,指定比较的轮数,一共是长度-1

for (int i=0; i<a.length-1; i++) {

    //内循环,将数组的值进行一一比较

    for (int j=0; j<a.length-i-1; j++) {

        if (a[j] > a[j+1]) {

            int temp = a[j];

            a[j] = a[j+1];

            a[j+1] = temp;

        }

    }

}

 

//输出排序后的数组进行验证

for (int i: a) {

System.out.println(i);

}

 

6.数组的动态扩展。


我们知道,在Java中,数组是固定长度不能扩展的。但是在现实情况中,动态地扩展数组以适应程序的要求是非常常见的。比如我们在WoniuATM中,要利用数组来完成用户的注册,但是我们并不知道具体的开户注册数量,所以无论我们定义何种固定长度的数组,都不能达到自适应的目的。如果数组定义得太短,不够用,定义得太长,则浪费存储空间,这是其必要性。先来看看Java中数组动态扩展的原理:


(1).定义数组A,然后定义数组B,数组B的长度为A的长度+1

(2).将数组A的值全部复制给B

(3).将数组B的地址赋值给数组A,即A=B即可。


通过上述原理的描述,我们可以得知,其实质并不是将数组A直接加长,而是新增一个数组,将新数组的地址赋值给原数组名,进而模拟出动态扩展的功能,来看看具体代码实现:


int[] a = {11, 22, 33, 44};

System.out.println("数组a的长度为:" + a.length);

int[] b = new int[a.length+1];

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

b[i] = a[i];

}

a = b;

System.out.println("数组a的长度为:" + a.length);

 

7.多维数组。


前面所学的都是一维数组的操作,在实际应用中,我们还有可能使用二维数组,三维数组,甚至N维数组。其实多维数组不难理解,就是数组的数组,比如二维数组,那么里面保存的每一个值就是一个一维数组,如下例所示:


int[][] twoDim = new int[4][];

twoDim[0] = new int[5];

twoDim [1] = new int[5];

 

在概念上可以用下图表示,行是一维,列是二维:

20180629_145029_057.png


下列代码展示了二维数组的定义,赋值及遍历等基本操作:


public void twoDimension() {

//可以在定义时不指定第二维的长度

int twoDim[][] = new int[4][];

//第二维的长度可以不固定,就不规则二维数组

twoDim[0] = new int[1];

twoDim[1] = new int[2];

twoDim[2] = new int[3];

twoDim[3] = new int[4];

//对数组进行赋值

int value = 1;

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

for (int j=0; j<i+1; j++) {

twoDim[i][j] = value;

value ++;

}

}


//将数组的值输出

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

for (int j=0; j<i+1; j++) {

System.out.print(twoDim[i][j]);

System.out.print("  ");

}

System.out.println();

}

}

 

上述代码的输出结果为:


1  

2  3  

4  5  6  

7  8  9  10  

 

多维数组也可以直接初始化,相当于把每一维初始化列表用它自己的{}括起来即可,如:


int m[][] = {

{0*0,0*1,0*2,0*3},

{1*0,1*1,1*2,1*3},

{2*0,2*1,2*2,2*3},

{3*0,3*1,3*2,3*3}

};

 

三维数组或N维数组的操作与上述代码类似:


publicvoid threeDimension(){

int threeD[][][] = new int [3][4][5];

int i,j,k;

// 对数组元素赋值

for(i=0; i< 3; i++)

for(j=0; j< 4; j++)

for(k=0; k< 5; k++)

threeD[i][j][k] = i*j*k;

// 访问数组元素并打印

for(i=0; i< 3; i++){

for(j=0; j< 4; j++){

for(k=0; k< 5; k++)

System.out.print(threeD[i][j][k]+ "");

System.out.println();

}

System.out.println();

}

}

 

8.ArrayList对象。


由于Java中数组的一些固有特性,限制了我们对数组的灵活运用。所以在Java中,我们可以使用ArrayList来代替数组的使用。ArrayList列表对象为我们提供了更加灵活的操作,比如长度自动增长,可以随时添加数据,遍历数据,删除数据等。下面我们来看看ArrayList的常用操作:


package com.woniuxy.java.basic;

//注意,要使用列表,必须导入相应的包s

import java.util.ArrayList;

import java.util.List;

 

public class ArrayListDemo {

public static void main(String[] args) {

//定义列表对象,长度不限,其保存的数据类型为字符串,注意声明方式

//之所以使用List来定义ArrayList,是因为List统一了接口

List<String> users = new ArrayList<String>();

//调用列表对象的add方法,往列表中添加数据

users.add("woniu");

users.add("admin");

users.add("hello");

users.add("qiang");

//利用for循环遍历该列表对象

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

System.out.println(users.get(i));

}


users.add("cheng");//继续添加一条数据

users.remove(2);//删除第3条数据

users.remove("cheng");// remove的重载方法,删除cheng这条数据


//使用contains来判断是否仍然包含数据cheng

if (users.contains("cheng")) {

System.out.println("删除未成功.");

}

else {

System.out.println("删除成功.");

}


//继续遍历输出,以确认上述操作的结果

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

System.out.println(users.get(i));

}

}

}

 


思考练习



1.自学并完成选择排序和二分查找算法的思路和代码实现。

2.如何完成数组的删除?或对数组指定位置的值进行删除?

 


下周推送:核心实验:实现WoniuATM的注册与登录






为了答谢大家对蜗牛学院的支持,蜗牛学院将会定期对大家免费发放干货,敬请关注蜗牛学院的官方微信。


20181009_153045_341.jpg

   
版权所有,转载本站文章请注明出处:蜗牛笔记, http://www.woniunote.com/article/152
上一篇: 17年毕业,行政管理转行软件测试,现已成功入职,月薪6.5K
下一篇: 蜗牛学院成都、西安两校同时开班,迎来了这些年轻的小伙伴们~
提示:登录后添加有效评论可享受积分哦!
最新文章
    最多阅读
      特别推荐
      回到顶部