Java知识详细巩固_note2(数组_附demo code_其一为杨辉三角简析)

简介: 继 Java基础知识的全面巩固_note1(附各种demo code)拜读《核心技术卷》,笔记之。提纲1.1 for each循环1.2 数组初始化以及匿名数组1.

Java基础知识的全面巩固_note1(附各种demo code)
拜读《核心技术卷》,笔记之。

提纲

1.1 for each循环
1.2 数组初始化以及匿名数组
1.3 数组拷贝(以及Arrays.copyOf())
1.4 命令行参数
1.5 数组排序
1.6 多维数组
1.7 不规则数组

1.数组

声明:

img_cbc577b34ddf41f5e882970119235ed0.png

以及:
img_19176039cb640e848a38e4c01527670a.png

1.1 for each循环
for(variable:collection) statement
img_eddfd6857b5dcb84ab5d87b4a960a39b.png

例如:

for(int element : a)
    System.out.println(element);

打印数组a的每一个元素,一个元素占一行。
另外:

img_b4d8bbd66ff3716870b3e4065c974062.png

 System.out.println(Arrays.toString(a));
1.2 数组初始化以及匿名数组

img_e48e3dc96f52d8281e8786a0d2d30aa6.png

!!注意使用这种语句时,不需要调用new。


匿名数组:

img_0c425d28e17d0ed1d953ad90b100d6cc.png

img_36bbed3e38f3b17d7537cee3d704ef23.png

在Java中,允许数组长度为0。可用于方法的返回结果为空数组的情况:
img_4491babe0e055463e3bfb1b84ee4f127.png

1.3 数组拷贝

1)

img_4df03a7723e19e2cddf16849e7942902.png

如图所示显示了拷贝的结果:
img_e85a594f4da9bcd259ed62cafed2de1c.png

2)
如果希望将一个数组的所有值拷贝到一个新的数组中去,就要使用Arrays类的copyOf方法:

img_32d0692f89a9109368a3f2537c88f3e5.png

3)
img_25bf033a04778b16ddad87a7507bd09b.png

4)

img_3e54315a618a1b0930c42cb17ee867d2.png

下面上一个Demo:

package Test;
//import java.lang.Math;
import java.util.Arrays;
//import java.util.Date;
//import java.util.Scanner;


public class Havaatry {

    public static void main(String[] args)
       {
        int[] a = {3,2,5,6,9,8,4,0};
        int[] b = Arrays.copyOf(a, 16);
        int[] c = Arrays.copyOf(a, 3);
        boolean[] A = {true,true,true,true,true};
        boolean[] B = Arrays.copyOf(A, 16);
        boolean[] C = Arrays.copyOf(A, 3);
        System.out.println(Arrays.toString(a));
        System.out.println(Arrays.toString(b));
        System.out.println(Arrays.toString(c));
        System.out.println(Arrays.toString(A));
        System.out.println(Arrays.toString(B));
        System.out.println(Arrays.toString(C));
       }

}

运行结果:

[3, 2, 5, 6, 9, 8, 4, 0]
[3, 2, 5, 6, 9, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[3, 2, 5]
[true, true, true, true, true]
[true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false]
[true, true, true]
1.4 命令行参数
img_aa7f0a015840099374cbc2a0cd28ec36.png
img_bc9ce09812278ef1a2ba78563035d6b8.png

img_11fbd42630445442c4ab8f1ec46eec3f.png
1.5 数组排序

img_2d4a56ed40baa7529c2f8823c8b69b69.png

下面上一个Demo,它产生一个抽奖游戏中的随机数值组合。假如抽奖是从49个数值中抽取6个,那么程序可能的输出结果为:
img_ff39ba73326b24b139ceabdc0eaa1837.png

img_498bb2e89edc668d1a8b5a5e47d4bf0c.png

现在,就可以开始抽取k个数值了。Math.random方法将返回一个[0,1) 之间的随机浮点数。用n乘以这个浮点数,就可以得到 [0,n) 之间的一个随机数,用(int) 强制转换类型,则是一个 [0,n-1] 的随机数。
img_4d1161f4f8f6c0dda40f2767d9011834.png

img_e44d1d771d6538c74da4d3910a89eda4.png

Demo code:

package Test;
//import java.lang.Math;
import java.util.Arrays;
//import java.util.Date;
import java.util.Scanner;


public class Havaatry {

    public static void main(String[] args)
       {
        Scanner in = new Scanner(System.in);

          System.out.print("How many numbers do you need to draw? ");
          int k = in.nextInt();

          System.out.print("What is the highest number you can draw? ");
          int n = in.nextInt();

          // fill an array with numbers 1 2 3 . . . n
          int[] numbers = new int[n];
          for (int i = 0; i < numbers.length; i++)
             numbers[i] = i + 1;

          // draw k numbers and put them into a second array
          int[] result = new int[k];
          for (int i = 0; i < result.length; i++)
          {
             // make a random index between 0 and n - 1
             int r = (int) (Math.random() * n);

             // pick the element at the random location
             result[i] = numbers[r];

             // move the last element into the random location
             numbers[r] = numbers[n - 1];
             n--;
          }

          // print the sorted array
          Arrays.sort(result);
          System.out.println("Bet the following combination. It'll make you rich!");
          for (int r : result)
             System.out.println(r);
       }

}

结果:

How many numbers do you need to draw? 5
What is the highest number you can draw? 12
Bet the following combination. It'll make you rich!
2
6
7
8
9

关键API:

img_c7f0d779fa117f0fde0844f26fcf3242.png

img_dbe282014686b468bc29febd9f8066f3.png

1.6 多维数组
img_a1d9c1643f2c369089f7ad18fa79a345.png

img_eacdf0ce54f3bb3eb50e0142cccde80d.png

img_50dbb65e58e3bed7c3763fe13e6a10af.png

img_f575e857f9cb8f7e31d7b52a78535be9.png

img_95b1d0094048f172e5ab52d739fc6142.png

img_2c22c16410bf3159375bbe304f00221b.png

下面上完整代码:

package Test;
//import java.lang.Math;
import java.util.Arrays;
//import java.util.Date;
import java.util.Scanner;


public class Havaatry {

    public static void main(String[] args)
       {
         final double STARTRATE = 10;
          final int NRATES = 6;
          final int NYEARS = 10;

          // set interest rates to 10 . . . 15%
          double[] interestRate = new double[NRATES];
          for (int j = 0; j < interestRate.length; j++)
             interestRate[j] = (STARTRATE + j) / 100.0;

          double[][] balances = new double[NYEARS][NRATES];

          // set initial balances to 10000
          for (int j = 0; j < balances[0].length; j++)
             balances[0][j] = 10000;

          // compute interest for future years
          for (int i = 1; i < balances.length; i++)
          {
             for (int j = 0; j < balances[i].length; j++)
             {
                // get last year's balances from previous row
                double oldBalance = balances[i - 1][j];

                // compute interest
                double interest = oldBalance * interestRate[j];

                // compute this year's balances
                balances[i][j] = oldBalance + interest;
             }
          }

          // print one row of interest rates
          for (int j = 0; j < interestRate.length; j++)
             System.out.printf("%9.0f%%", 100 * interestRate[j]);

          System.out.println();

          // print balance table
          for (double[] row : balances)
          {
             // print table row
             for (double b : row)
                System.out.printf("%10.2f", b);

             System.out.println();
          }
       }

}

运行结果:

img_846fdac90c24b5502479249f3ecabfaa.png

另外:关于for each 以及 deepToString()

img_6da83a4d3f272dfac42ad3f751357b53.png

1.7 不规则数组

1)
Java实际上没有多维数组,只有一位数组:

img_d71d4985764557ca088aafb7e1349cb0.png

例如,在前面的实例中,balances数组实际上是一个包含10个元素的数组,而每个元素又是一个由6个浮点数组成的数组。如图:

img_f8e4781eb5e4e431ffe9da63d4f1e64b.png


2)


img_cb2006923b980d1261c2700d50244356.png

3)由于可以单独地存取数组的某一行,所以可以让两行交换:

img_c6f3c06c1c208b9c1393f0dbd8874ef0.png


4)

img_abe9659558b31dfcf204ab5bd85a40ca.png

也即i中取j的组合算法,这个三角形也即杨辉三角。

编程思路:

img_b4ff63071ee99bb50663b235745f6db6.png

img_91522e9c90da3508a50f8779e712fb47.png

下面代码貌似有些长,但也只有三步:

1.  “动态”分配数组;
2.  计算各个数组各个元素的值;
3.  遍历输出;

代码:

package Test;
//import java.lang.Math;
import java.util.Arrays;
//import java.util.Date;
import java.util.Scanner;


public class Havaatry {

    public static void main(String[] args)
       {
         final int NMAX = 10;

          // allocate triangular array      “动态”分配三角阵列
          int[][] odds = new int[NMAX + 1][];
          for (int n = 0; n <= NMAX; n++)
             odds[n] = new int[n + 1];

          // fill triangular array
          for (int n = 0; n < odds.length; n++)//遍历各行
             for (int k = 0; k < odds[n].length; k++)//遍历第n行的各列
             {
                /*
                 * compute binomial coefficient n*(n-1)*(n-2)*...*(n-k+1)/(1*2*3*...*k)
                 */
                int lotteryOdds = 1;
                for (int i = 1; i <= k; i++)
                   lotteryOdds = lotteryOdds * (n - i + 1) / i;

                odds[n][k] = lotteryOdds;
             }

          // print triangular array
          for (int[] row : odds)
          {
             for (int odd : row)
                System.out.printf("%4d", odd);
             System.out.println();
          }
       }
}

运行结果:

   1
   1   1
   1   2   1
   1   3   3   1
   1   4   6   4   1
   1   5  10  10   5   1
   1   6  15  20  15   6   1
   1   7  21  35  35  21   7   1
   1   8  28  56  70  56  28   8   1
   1   9  36  84 126 126  84  36   9   1
   1  10  45 120 210 252 210 120  45  10   1

杨辉三角组合律:

img_db07b1a233d5eee9cc07c55a026cb7a7.png

另外:

img_3dc3e09fe862b3b3b32db6dee7dbba54.png

目录
相关文章
|
6月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
471 6
|
7月前
|
Java
Java 数组学习笔记
本文整理Java数组常用操作:遍历、求和、查找、最值及二维数组行求和等典型练习,涵盖静态初始化、元素翻倍、去极值求平均等实例,帮助掌握数组基础与应用。
|
8月前
|
存储 缓存 Java
Java数组全解析:一维、多维与内存模型
本文深入解析Java数组的内存布局与操作技巧,涵盖一维及多维数组的声明、初始化、内存模型,以及数组常见陷阱和性能优化。通过图文结合的方式帮助开发者彻底理解数组本质,并提供Arrays工具类的实用方法与面试高频问题解析,助你掌握数组核心知识,避免常见错误。
|
9月前
|
存储 Java 索引
java 数组
在 Java 中,数组是一种数据结构,用于存储多个相同类型的数据元素。数组的大小一旦创建后就不能改变,因此它是固定长度的。Java 数组是一种 对象,即使它存储的值是基本类型(如 int、double 等),它也是一个对象引用。
217 0
|
11月前
|
存储 人工智能 Java
打乱数组内容引发的问题( Java)
本文介绍了两种实现数组随机打乱的方法,并深入探讨了Java中原始数据类型与对象类型的差异。方法一通过自定义随机数交换数组元素位置,方法二借助`Collections.shuffle()`函数完成数组打乱。同时,文章详细解析了`int`和`Integer`的区别,包括声明方式、内存占用、初始化以及对象特性等,并讲解了自动装箱与拆箱的功能,帮助读者更好地理解Java的基础知识。
177 0
|
存储 Java 数据挖掘
Java 中数组的多种定义方式
本文深入解析了Java中数组的多种定义方式,涵盖基础的`new`关键字创建、直接初始化、动态初始化,到多维数组、`Arrays.fill()`方法以及集合类转换为数组等高级用法。通过理论与实践结合的方式,探讨了每种定义方法的适用场景、优缺点及其背后的原理,帮助开发者掌握高效、灵活的数组操作技巧,从而编写更优质的Java代码。
631 0
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
935 1
Java 中数组Array和列表List的转换
|
存储 Java 索引
Java 复制数组
本文介绍了Java中数组的基础知识与常用操作,包括数组的概念、创建、访问元素、遍历、复制、排序和搜索等方法。同时详细讲解了数组的五种赋值方式,并通过代码示例演示了求总和平均值、最大最小值、升序降序排序及Arrays类的常用方法。内容深入浅出,适合初学者学习掌握Java数组的核心功能与应用场景。
295 2
|
存储 监控 Java
《从头开始学java,一天一个知识点》之:数组入门:一维数组的定义与遍历
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。明日预告:《多维数组与常见操作》。 通过实例讲解数组的核心认知、趣味场景应用、企业级开发规范及优化技巧,帮助你快速掌握Java数组的精髓。
436 23
下一篇
开通oss服务