0
点赞
收藏
分享

微信扫一扫

【JavaSE成神之路】数组思考题讲解


 

哈喽,我是兔哥呀,今天就让我们继续这个JavaSE成神之路!

这一节啊,咱们要学习的内容是数组的思考题讲解,也就是上一节我留下的两个小作业。

【JavaSE成神之路】数组思考题讲解_字符串

数组是非常重要的知识点,也是我们后续学习各种数据结构的基础,所以我们要专门抽一节出来,把那两道题目讲一讲。

有好处的。

回顾思考题

1.编写一个方法,接收一个int类型数组,返回数组内所有元素的和。

2.编写一个方法,接收一个String类型的参数,里面设置一个String类型的局部数组变量,要求每次调用该方法时,参数要均匀地分配到数组。(即实现一个简易的hash表,不考虑hash冲突问题)

第一题解法与思路

第一题还是比较简单的,只要我们熟悉了一维数组的声明和创建、以及初始化,还有循环的语法就可以轻松实现啦。

public int sum(int[] nums){
int sum = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
}
return sum;
}

这段代码声明了一个名为sum的函数,它接受一个int类型的数组作为参数。然后在其中声明了一个名为sum的变量,初始值为0,然后使用for循环遍历数组,将每个元素的值累加到sum变量中,最后返回sum变量的值。

逻辑看起来是没有什么问题,你要让程序更健壮一些的话,可以再加个非空判断。

public int sum(int[] nums){
if(nums == null){
throw new RuntimeException("参数不允许为空!");
}
int sum = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
}
return sum;
}

throw new RuntimeException的意思是抛出一个运行时异常,异常的相关知识我们会在后面的章节学到。

测试:

public static void main(String[] args) {
Test test = new Test();
int sum = test.sum(new int[]{1, 2, 3, 4});
System.out.println(sum);
}

答案是​​10​​。

因为sum方法是写在Test类里面的,所以要调用方法就先得把class给new出来。

如果你传个null进去,就会报错:

int sum = test.sum(null);

效果:

【JavaSE成神之路】数组思考题讲解_java_02

为什么不能传空呢,大家可以看着代码,思考一下这个问题?

顺便问下,还能优化吗?自然是可以的,比如我们可以用Java8的Stream来做简化:

public int sum(int[] nums){
if(nums == null){
throw new RuntimeException("参数不允许为空!");
}
return IntStream.of(nums).sum();
}

具体来说,代码中使用了 Java 8 中的 IntStream 类的 of 方法来将数组转换成一个整型流,然后使用 sum 方法对流中的元素求和,并将结果返回。

第二题解法与思路

开始第二题,编写一个方法,接收一个String类型的参数,里面设置一个String类型的局部数组变量,要求每次调用该方法时,参数要均匀地分配到数组。(即实现一个简易的hash表,不考虑hash冲突问题)

简单来说,就是你给我一个Sring对象,我要根据某种规则均匀地放置到数组中!

比如我有个长度为10的数组,接收一个“Hello”字符串,我们首先要根据Hash算法得出一个数字,也就是HashCode,然后用取模运算得到数组的下标。

代码大概长这样:

public void distributeString(String str) {
// 定义一个局部数组变量
String[] arr = new String[10];

// 计算 str 的哈希值
int hash = str.hashCode();
// 计算 str 在数组中的下标
int index = hash % arr.length;

// 将 str 分配到数组的对应位置
arr[index] = str;
}

这个方法接收一个 String 类型的参数 str。在方法内部,我们定义了一个局部数组变量 arr,并将其初始化为一个长度为 10 的数组。然后,我们使用字符串的 hashCode 方法计算出字符串的哈希值,并使用模运算计算出该字符串在数组中的下标。最后,我们将字符串分配到数组的对应位置。

这样,每次调用这个方法时,传入的字符串都会均匀地分配到数组中。

注意:这个方法只是一个简单的实现,实际上 hash 冲突是一个很常见的问题,需要使用更加复杂的算法来解决。这里只是为了给出一个基本的思路。

什么是HashCode?

Java的hashCode方法是用来获取对象的散列码的方法。散列码是一个整数,它是通过对象的属性进行计算得到的。

Java中的散列码通常用来支持哈希表(也称为散列表)这种数据结构。哈希表是一种高效的查找和插入数据的方式,它通过使用散列函数将数据映射到表中的桶(也称为桶位置)来实现。

如果两个对象的hashCode相等,那么这两个对象可能相等(但不一定相等)。如果两个对象的hashCode不相等,那么这两个对象一定不相等。

Java中的每个对象都有一个hashCode方法,因此你可以在任何对象上调用这个方法。例如,你可以在字符串上调用hashCode方法来获取字符串的散列码:

String s = "Hello, World!";
int hashCode = s.hashCode();

值得注意的是,hashCode方法的返回值并不唯一,也就是说,不同的对象可能会返回相同的散列码。因此,如果你想要判断两个对象是否相等,你应该使用equals方法,而不是使用hashCode方法。

测试distributeString方法,首先我们把数组放到成员属性中去,不然每次调用数组都被重置了。

String[] arr = {"  ","  ","  ","  ","  ","  ","  ","  ","  ","  "};

public void distributeString(String str) {

// 计算 str 的哈希值
int hash = str.hashCode();
// 计算 str 在数组中的下标
int index = hash % arr.length;

// 将 str 分配到数组的对应位置
arr[index] = str;

//打印数组
System.out.print("[ ");
for (int i = 0; i < arr.length; i++) {
if(i == arr.length - 1){
System.out.print(arr[i]);
}else
System.out.print(arr[i] + ",");
}
System.out.println("]");
}

public static void main(String[] args) {
Test test = new Test();
test.distributeString("Hello");
test.distributeString("world");
test.distributeString("Java");
}

结果:

[ Hello,  ,  ,  ,  ,  ,  ,  ,  ,  ]
[ Hello, ,world, , , , , , , ]
[ Hello, ,world, , , ,Java, , , ]

好啦,关于这两道思考题的讲解,就到这里啦。

举报

相关推荐

0 条评论