文章目录



请求出一个数组 int[]的最大值 {4, -1, 9, 10, 23},并得到其对应的下标
思路分析:
- 定义一个 int 数组 int[] arr = {4,-1,9, 10,23};
- 假定 max = arr[0] 是最大值 , maxIndex=0;
- 从下标 1 开始遍历 arr, 如果 max < 当前元素,说明 max 不是真正的最大值, 我们就 max=当前元素; maxIndex=当前元素下标;
- 当我们遍历这个数组 arr 后 , max 就是真正的最大值,maxIndex 最大值对应的下标。
public class ArrayExercise02 {
//编写一个 main 方法
public static void main(String[] args) {
int[] arr = {4,-1,9,10,23};
int max = arr[0];
//假定第一个元素就是最大值
int maxIndex = 0;
for(int i = 1; i < arr.length; i++) {
//从下标 1 开始遍历 arr
if(max < arr[i]) {
//如果 max < 当前元素
max = arr[i]; //把 max 设置成 当前元素
maxIndex = i;
}
}
//当我们遍历这个数组 arr 后 , max 就是真正的最大值,maxIndex 最大值下标
System.out.println("max=" + max + " maxIndex=" + maxIndex);
}
}

// 基本类型的赋值
int n1 = 10;// 给基本类型变量赋值
int n2 = n1;// 将n1的值赋值给n2,实质上等同于int n2 = 10
n2 = 80;// 将80赋值给n2,不会影响n1 的值
// 在基本类型的赋值中,赋予给变量的是一个确定的值,每个变量对应着不同的栈内存空间,彼此之间不会相互影响。
// 引用类型的赋值
int[] arr1 = {1, 2, 3};// 在栈内存中声明了一个数组类型变量arr1,在堆内存中为该变量开辟了一个长度为3 的内存空间
int[] arr2 = arr1;// 将arr1的内存地址赋值给arr2,此时arr1和arr2共用一个堆内存空间
arr2[0] = 10;// 将100赋值给arr2中的第一个元素,相当于将10赋值给地址中的第一个元素,同时相当于改变了arr1中的第一个元素的值
// 在引用类型的赋值中,赋予给变量的是内存地址,此时多个变量对应着同一个堆内存空间,彼此之间相互影响。
public class ArrayCopy {
public static void main(String[] args) {
//将 int[] arr1 = {10,20,30}; 拷贝到 arr2 数组,
//要求数据空间是独立的. int[] arr1 = {10,20,30};
//创建一个新的数组 arr2,开辟新的数据空间 //大小 arr1.length;
int[] arr2 = new int[arr1.length];
//遍历 arr1 ,把每个元素拷贝到 arr2 对应的元素位置
for(int i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
//修改 arr2中的元素, 不会对 arr1 有影响.
arr2[0] = 100;
//输出 arr1
System.out.println("====arr1 的元素====");
for(int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);// 10,20, 30
}
System.out.println("====arr2 的元素====");
for(int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);//
}
}
}
// 方法一:观察规律
public class ArrayReverse {
//编写一个 main 方法
public static void main(String[] args) {
//定义数组
int[] arr = {11, 22, 33, 44, 55, 66};
int temp = 0;
int len = arr.length;
//计算数组的长度
for( int i = 0; i < len / 2; i++) {
temp = arr[len - 1 - i];//保存
arr[len - 1 - i] = arr[i]; arr[i] = temp;
}
System.out.println("===翻转后数组===");
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");//66,55,44,33,22,11
}
}
}
// 方法二:采用逆序赋值
public class ArrayReverse02 {
//编写一个 main 方法
public static void main(String[] args) {
//定义数组
int[] arr = {11, 22, 33, 44, 55, 66};
//使用逆序赋值方式
//老韩思路
//1. 先创建一个新的数组 arr2 ,大小 arr.length
//2. 逆序遍历 arr ,将 每个元素拷贝到 arr2 的元素中(顺序拷贝)
//3. 建议增加一个循环变量 j -> 0 -> 5
int[] arr2 = new int[arr.length];
//逆序遍历 arr
for(int i = arr.length - 1, j = 0; i >= 0; i--, j++) {
arr2[j] = arr[i];
}
//4. 当 for 循环结束,arr2 就是一个逆序的数组 {66, 55, 44,33, 22, 11}
//5. 让 arr 指向 arr2 数据空间, 此时 arr 原来的数据空间就没有变量引用会被当做垃圾,销毁 arr = arr2;
System.out.println("====arr 的元素情况=====");
//6. 输出 arr 看看
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
}
}
- 原始数组使用静态分配 int[] arr = {1,2,3} ;
- 添加的元素 4,直接放在数组的最后 arr = {1,2,3,4} ;
- 用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n
- 思路分析:
1. 定义初始数组 int[] arr = {1,2,3} //下标 0-2;
2. 定义一个新的数组 int[] arrNew = new int[arr.length+1];
3. 遍历 arr 数组,依次将 arr 的元素拷贝到 arrNew 数组 ;
4. 将 4 赋给 arrNew[arrNew.length - 1] = 4;把 4 赋给 arrNew 最后一个元素 ;
5. 让 arr 指向 arrNew ; arr = arrNew;原来分配给 arr的堆内存空间会被销毁 ;
6. 创建一个 Scanner 可以接受用户输入 ;
7. 因为用户什么时候退出,不确定,使用 do-while + break 来控制 。
public class ArrayAdd02 {
public static void main(String[] args) {
//要求:实现动态的给数组添加元素效果,实现对数组扩容。
Scanner myScanner = new Scanner(System.in);
//初始化数组
int[] arr = {1,2,3};
do {
int[] arrNew = new int[arr.length + 1];
//遍历 arr 数组,依次将 arr 的元素拷贝到 arrNew 数组
for(int i = 0; i < arr.length; i++) {
arrNew[i] = arr[i];
}
System.out.println("请输入你要添加的元素");
int addNum = myScanner.nextInt();
//把 addNum 赋给 arrNew 最后一个元素
arrNew[arrNew.length - 1] = addNum;
//让 arr 指向 arrNew,
arr = arrNew;
//输出 arr 看看效果
System.out.println("====arr 扩容后元素情况====");
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
//问用户是否继续
System.out.println("是否继续添加 y/n");
char key = myScanner.next().charAt(0);
if( key == 'n') {
//如果输入 n ,就结束
break;
}
} while(true);
System.out.println("你退出了添加...");
}
}
public class ArrayAdd02 {
public static void main(String[] args) {
Scanner myScanner = new Scanner(System.in);
//初始化数组
int[] array1 = {1, 2, 3, 4, 5};
do {
int[] array2 = new int[array1.length-1];
for (int i = 0; i < array2.length; i++) {
if (i < array1.length) {
array2[i] = array1[i];
}
}
array1 = array2;
for (int i = 0; i < array1.length; i++) {
System.out.print(array1[i]);
}
if (array1.length == 1) {
System.out.println("数组中只剩下最后一个元素,不能再缩减!");
break;
}
System.out.println("你是否还要缩减y/n");
char c = sc.next().charAt(0);
if (c == 'n') {
break;
}
} while (true);
}
}
举例解释:将一个无序的数组:{24, 69, 80, 57, 13} 使用冒泡排序法将其排成一个从小到大的有序数组。
- 思路分析:图示
public class BubbleSort {
public static void main(String[] args) {
// 冒泡排序
// 补充:优化策略:如果在某一次比较中,没有元素交换,则表示已经排序好了,可以break;(不用理)
int[] arr = {24, 69, 80, 57, 13};
// 有n个元素,只需要排序n-1轮,每一轮会将一个元素放到正确的位置
// 则剩下的最后一个元素就不需要排序了
for (int i = 0; i < arr.length - 1; i++) {
int tmp = 0;// 用于辅助交换的变量
// 有n个元素,每一轮只需要比较n-1次,n是在不断变化的
for (int k = 0; k < arr.length - i - 1; k++) {
// 如果前面的元素>后面的元素,就交换
if (arr[k] > arr[k + 1]) {
tmp = arr[k];
arr[k] = arr[k + 1];
arr[k + 1] = tmp;
}
}
}
// 遍历输出排序后的数组
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
举例:有一个数组 {1, 3, 5, 7, 9},从键盘中任意输入的一个数,要求: 如果找到了,就提示找到,并给出下标值;否则提示未找到。
public class SeqSearch {
public static void main(String[] args) {
// 顺序查找
Scanner sc = new Scanner(System.in);
int[] arr = {1, 3, 5, 7, 9};
System.out.println("请输入一个数:");
int input = sc.nextInt();
int index = -1;// 一个编程技巧,用来判断是否进入一个代码块
for (int i = 0; i < arr.length; i++) {
if (input == arr[i]) {
System.out.println("你找到了" + arr[i]);
index = i;// 一个标识符,用来判断是否成功进入该代码块,若进入,则改变该标识符的值,否则该标识符的值仍为初始值
break;// 找到该元素,直接退出循环
}
}
// index 未改变,说明没有找到需要的元素
if (index == -1) {
System.out.println("该数组中没有你要找的数!");
}
}
}
什么是二维数组?
从定义形式上看: int [][];
可以这样理解,一个一维数组中的每个元素都是一维数组,这样就构成了二维数组。
举例:
int[][] arr = { {0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1},
{2, 2, 2, 2, 2, 2}, {3, 3, 3, 3, 3, 3}
};
关于二维数组的关键概念:
二维数组的元素个数 = 二维数组中一维数组的个数 = arr.length;
二维数组的每个元素是一维数组,所以如果需要得到每个一维数组中的元素,还需要再遍历一维数组;
arr[i][j]表示:二维数组的第 i+1 个一维数组的第 j+1 个元素;
arr[0][0]表示:二维数组 arr 中的第1个一维数组中的第1个元素。例子:输出二维数组中的一维数组中的每一个元素
public class TwoDimensionalArray01 {
public static void main(String[] args) {
int[][] arr = { {0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1},
{2, 2, 2, 2, 2, 2}, {3, 3, 3, 3, 3, 3}
};
// 遍历二维数组中的每个元素(一维数组)
for(int i = 0; i < arr.length; i++) {
// 1. arr[i] 表示:二维数组的第 i+1 个一维数组。比如 arr[0]:二维数组的第一个一维数组
// 2. arr[i].length 得到对应的每个一维数组的长度
for(int j = 0; j < arr[i].length; j++) {
// 输出二维数组中的一维数组中的每一个元素
System.out.print(arr[i][j] + " ");
}
System.out.println();//换行
}
}
}
控制台输出:

由控制台的输出,我们可以简单理解二维数组的形式:一个二维数组中有几个一维数组,这个二维数组就有几行;而每个一维数组中的元素的个数,就是该行对应的列数。
基本语法:
定义数组并同时为数组中的所有元素赋值:数据类型[][] 数组名 = {{值1, 值2, ..}, {值1, 值2, ..}, {值1, 值2, ..}};
int[][] arr = {{1, 1, 1}, {8, 8, 9}, {10}};注意:二维数组的每个元素必须是一维数组,不允许是其他数据类型;每个一维数组中的元素个数可以相等/不相等。上例中,第1个一维数组有 3 个元素,第2个一维数组有 3 个元素,而第三个一维数组只有 1 个元素。
代码:
int[][] arr = {{1, 1, 1}, {8, 8, 9}, {10}};
// 遍历二维数组中的每个元素(一维数组)
for(int i = 0; i < arr.length; i++) {
// 1. arr[i] 表示:二维数组的第 i+1 个一维数组。比如 arr[0]:二维数组的第一个一维数组
// 2. arr[i].length 得到对应的每个一维数组的长度
for(int j = 0; j < arr[i].length; j++) {
// 输出二维数组中的一维数组中的每一个元素
System.out.print(arr[i][j] + " ");
}
System.out.println();// 换行
}
控制台输出:

显然,上例中的二维数组中包含了3个一维数组,因此该二维数组有3行,而每个一维数组中的元素个数不同,所以每一行的列数都不同。
基本语法:
先定义数组:数据类型[][] 数组名 = new 数据类型[数组大小][数组大小];
int arr[][] = new int[2][3];再给一维数组中的每个元素赋值,若不赋值,则为定义的数据类型的默认值。
这种初始化方式在声明二维数组的同时开辟了其所需要的堆内存空间,这种方式创建出的每一个一维数组的空间都是一样的(即二维数组的列数是一样的)。
代码:
// 定义一个二维数组,同时为数组开辟内存空间,此时二维数组的行数为3,列数为2。也就是我们所说的列数相同
int[][] arr = new int[3][2];
// 然后再遍历所有的一维数组,给其中的每个元素赋值。省略...
基本语法:
数据类型[][] 数组名;。数组名 = new 数据类型[数组大小][数组大小];。此时每个一维数组的内存空间都已经开辟。第二种方式其实是和第一种方式大同小异的。第一种方式是在声明的同时定义;而第二中是先声明数组,后面需要用到的时候再定义。
代码:
// 先声明一个二维数组
int[][] arr;
// 再为数组开辟内存空间,此时二维数组的行数为3,列数为2。也就是我们所说的列数相同
arr = new int[3][2];
// 最后再遍历所有的一维数组,给其中的每个元素赋值。省略...
基本语法:
数据类型[][] 数组名;。数组名 = new 数据类型[数组大小][];。 注意:此时所有的一维数组都未开辟堆内存空间。代码:
// 定义二维数组。此时所有的一维数组还没有分配内存空间;arr[i]的地址为null;
int[][] arr = new int[3][];
// 遍历二维数组,给每个一维数据开辟内存空间。这种方式会使得每个一维数组的大小可以不一样
for (int i = 0; i < arr.length; i++) {
// 给每个一维数组开辟空间,若没有这一步,一维数组的内存空间就是 null;
arr[i] = new int[i + 1];
}
// 最后再遍历所有的一维数组,给其中的每个元素赋值。省略...
以动态初始化的第一种方式为例,int arr[][] = new int[2][3];
其内存示意图如下:

示意图说明:
int类型的二维数组的 arr[2][3],于是JVM在堆内存中为arr开辟了一个大小为 2 的地址空间,这两个空间里面分别存储着一维数组 arr[0]、arr[1] 的地址;arr[0]、arr[1] 的内存地址,空间里面存储着一维数组中的元素。注意:如果是以第三种方式(列数不确定)创建一个二维数组,例如:
int[][] arr = new int[3][];。则此时所有的一维数组都没有开辟内存空间,它们的地址都为 null;
一维数组的声明方式有: int[] x 或者 int x[]。
二维数组的声明方式有: int[][] arr 或者 int[] arr[] 或者 int arr[][]。
二维数组实际上是由多个一维数组构成的,它的各个一维数组的内存大小可以相同,也可以不相同。
map[][] 是 一个二维数组, int[][] map = {{1, 2}, {3, 4, 5}};其中,map[0] 是一个含有2个元素的一维数组 ,map[1] 是一个含有3个元素的一维数组,因此, map[][] 也称为 “列数不等的二维数组”。案例一:使用二维数组打印一个 10 行 杨辉三角,如下图所示:

规律:
- 第一行有 1 个元素, 第 n 行有 n 个元素 ;
- 每一行的第一个元素和最后一个元素都是 1 ;
- 从第三行开始, 对于非第一个元素和最后一个元素的元素的值
arr[i][j],arr[i][j] = arr[i-1][j] + arr[i-1][j-1]。
代码实现:
public class TwoDimentionalArray01 {
public static void main(String[] args) {
int[][] a = new int[10][];
for (int i = 0; i < a.length; i++) {
// 给每个一维数组开辟堆内存空间,第n行有n个元素
a[i] = new int[i + 1];
// 遍历每一个一维数组,赋值
for (int j = 0; j < a[i].length; j++) {
// 每一行的第一个元素和最后一个元素都是1
if (j == 0 || j == a[i].length - 1) {
a[i][j] = 1;
} else {
// 每一行非第一个元素和最后一个元素的值 = 上一行的同一列 + 上一行的上一列
a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
}
}
}
// 输出杨辉三角
for (int i = 0; i < a.length; i++) {
for (int k = 0; k < a[i].length; k++) {
System.out.print(a[i][k] + "\t");
}
System.out.println();
}
}
}
总结
本文是小白博主在学习B站韩顺平老师的Java网课时整理的学习笔记,在这里感谢韩顺平老师的网课,如有有兴趣的小伙伴也可以去看看。
最后,如果本文有什么错漏的地方,欢迎大家批评指正!一起加油!!
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer