java-Arrays实战案例

8. `Arrays` 类的实战案例

为了更好地理解和掌握 `Arrays` 类的使用,下面提供一些实际应用案例。

8.1 处理学生成绩

假设我们需要处理一个学生成绩的数组,包括对成绩进行排序、查找特定成绩、计算平均成绩等操作。

```java

import java.util.Arrays;

class Student {

String name;

int score;

Student(String name, int score) {

this.name = name;

this.score = score;

}

@Override

public String toString() {

return name + ": " + score;

}

}

public class StudentScoresExample {

public static void main(String\[\] args) {

Student\[\] students = {

new Student("Alice", 85),

new Student("Bob", 92),

new Student("Charlie", 88),

new Student("David", 79),

new Student("Eve", 91)

};

// 对学生成绩进行排序

Arrays.sort(students, (s1, s2) -> Integer.compare(s2.score, s1.score));

System.out.println("Sorted students by score: " + Arrays.toString(students));

// 查找特定成绩的学生

int targetScore = 88;

int index = Arrays.binarySearch(

Arrays.stream(students).mapToInt(s -> s.score).toArray(), targetScore);

System.out.println("Index of student with score " + targetScore + ": " + index);

// 计算平均成绩

double averageScore = Arrays.stream(students).mapToInt(s -> s.score).average().orElse(0.0);

System.out.println("Average score: " + averageScore);

}

}

```

8.2 处理大数据集

在处理大数据集时,可以利用 `Arrays.parallelSort` 方法提高排序性能。

```java

import java.util.Arrays;

import java.util.Random;

public class LargeDatasetExample {

public static void main(String\[\] args) {

int\[\] largeArray = new int1000000;

Random rand = new Random();

// 填充数组

Arrays.setAll(largeArray, i -> rand.nextInt(1000000));

System.out.println("Array filled.");

// 并行排序

long startTime = System.nanoTime();

Arrays.parallelSort(largeArray);

long endTime = System.nanoTime();

System.out.println("Parallel sorted array.");

System.out.println("Time taken: " + (endTime - startTime) / 1_000_000 + " ms");

```java

}

}

```

在这个示例中,我们生成了一个包含一百万个随机整数的数组,并使用 `Arrays.parallelSort` 方法对其进行并行排序。我们记录了排序所需的时间,以便了解并行排序的性能提升。

8.3 数组的去重与统计

假设我们有一个包含大量重复元素的数组,我们需要去重并统计每个元素的出现次数。

```java

import java.util.Arrays;

import java.util.HashMap;

import java.util.Map;

import java.util.stream.Collectors;

public class ArrayDeduplicationExample {

public static void main(String\[\] args) {

int\[\] array = {1, 2, 3, 4, 5, 3, 2, 1, 4, 5, 5, 5};

// 去重

int\[\] uniqueArray = Arrays.stream(array).distinct().toArray();

System.out.println("Unique array: " + Arrays.toString(uniqueArray));

// 统计每个元素的出现次数

Map<Integer, Long> frequencyMap = Arrays.stream(array)

.boxed()

.collect(Collectors.groupingBy(e -> e, Collectors.counting()));

System.out.println("Element frequencies: " + frequencyMap);

}

}

```

在这个示例中,我们使用 Java Stream API 对数组进行去重,并统计每个元素的出现次数。去重操作通过 `distinct` 方法实现,而统计操作通过 `groupingBy` 和 `counting` 收集器实现。

8.4 合并和交集操作

假设我们有两个数组,我们需要计算它们的并集和交集。

```java

import java.util.Arrays;

import java.util.Set;

import java.util.stream.Collectors;

public class ArrayUnionIntersectionExample {

public static void main(String\[\] args) {

Integer\[\] array1 = {1, 2, 3, 4, 5};

Integer\[\] array2 = {4, 5, 6, 7, 8};

// 计算并集

Set<Integer> unionSet = Arrays.stream(array1)

.collect(Collectors.toSet());

unionSet.addAll(Arrays.stream(array2).collect(Collectors.toSet()));

System.out.println("Union: " + unionSet);

// 计算交集

Set<Integer> intersectionSet = Arrays.stream(array1)

.filter(e -> Arrays.asList(array2).contains(e))

.collect(Collectors.toSet());

System.out.println("Intersection: " + intersectionSet);

}

}

```

在这个示例中,我们使用 Java Stream API 计算两个数组的并集和交集。并集操作通过将两个数组转换为集合并合并集合来实现,交集操作通过过滤第一个数组中的元素是否存在于第二个数组中来实现。

9. 实战练习

为了进一步巩固对 `Arrays` 类的理解和应用,我们提供以下实战练习:

练习 1:查找数组中的第二大元素

编写一个方法,找到给定整数数组中的第二大元素。

```java

import java.util.Arrays;

public class SecondLargestElement {

public static void main(String\[\] args) {

int\[\] array = {3, 5, 7, 2, 8, 6, 4, 7, 5, 6};

System.out.println("Second largest element: " + findSecondLargest(array));

}

public static int findSecondLargest(int\[\] array) {

if (array.length < 2) {

throw new IllegalArgumentException("Array must contain at least two elements.");

}

Arrays.sort(array);

int secondLargest = arrayarray.length - 2;

for (int i = array.length - 2; i >= 0; i--) {

if (arrayi != arrayarray.length - 1) {

secondLargest = arrayi;

break;

}

}

return secondLargest;

}

}

```

练习 2:反转数组

编写一个方法,反转给定的整数数组。

```java

import java.util.Arrays;

public class ReverseArray {

public static void main(String\[\] args) {

int\[\] array = {1, 2, 3, 4, 5};

reverseArray(array);

System.out.println("Reversed array: " + Arrays.toString(array));

}

public static void reverseArray(int\[\] array) {

int left = 0, right = array.length - 1;

while (left < right) {

int temp = arrayleft;

arrayleft = arrayright;

arrayright = temp;

left++;

right--;

}

}

}

```

练习 3:移除数组中的特定元素

编写一个方法,移除给定整数数组中的所有特定元素。

```java

import java.util.Arrays;

public class RemoveElement {

public static void main(String\[\] args) {

int\[\] array = {3, 2, 2, 3, 4, 2, 5};

int\[\] newArray = removeElement(array, 2);

System.out.println("Array after removing 2: " + Arrays.toString(newArray));

}

public static int\[\] removeElement(int\[\] array, int element) {

return Arrays.stream(array)

.filter(e -> e != element)

.toArray();

}

}

```

10. 总结

通过对 `java.util.Arrays` 类的深入探讨,我们了解了这个类在数组操作中的重要作用。`Arrays` 类提供了一系列强大的静态方法,使得对数组的处理变得更加简洁和高效。通过掌握这些方法,我们可以轻松地进行排序、搜索、复制、比较、填充等操作,并能利用流 API 和并行处理进一步提升性能。

以下是 `Arrays` 类的主要功能总结:

  1. **排序**:`sort` 和 `parallelSort` 方法用于排序数组,适用于原生类型数组和对象数组。

  2. **搜索**:`binarySearch` 方法用于在有序数组中进行二分查找。

  3. **复制**:`copyOf` 和 `copyOfRange` 方法用于复制数组。

  4. **比较**:`equals` 和 `deepEquals` 方法用于比较数组是否相等。

  5. **填充**:`fill` 方法用于将数组的所有元素或部分元素填充为指定值。

  6. **哈希码**:`hashCode` 和 `deepHashCode` 方法用于计算数组的哈希码。

  7. **字符串表示**:`toString` 和 `deepToString` 方法用于将数组转换为字符串表示。

  8. **转换**:`asList` 方法用于将数组转换为 `List`。

  9. **多维数组**:`deepEquals`、`deepHashCode` 和 `deepToString` 方法用于处理多维数组。

  10. **并行处理**:`parallelSort` 和 `parallelSetAll` 方法用于并行处理数组。

通过对 `Arrays` 类的全面理解和实践,我们可以极大地提高数组操作的效率和代码质量。在实际开发中,合理使用 `Arrays` 类提供的方法,可以使得数组操作更加简洁、高效和易维护。

相关推荐
李少兄3 小时前
Java 中只有值传递吗?
java·开发语言·python
名字还没想好☜3 小时前
Spring @EventListener 事件驱动解耦实战:同步转异步、事务绑定与顺序控制
java·数据库·后端·python·spring
果壳science3 小时前
《自然本源》如何实现狭义相对论的代数化
笔记·算法·几何学
一木 之林3 小时前
插件、MCP、Skill 的区别?
java·c++·人工智能
可乐鸡翅yeah_3 小时前
hls.js 播放质量埋点实战,采集卡顿、起播、错误指标定位线上用户问题
开发语言·前端·javascript·ecmascript·音视频·m3u8·音视频在线播放
小刘在重生~3 小时前
面试重点:final、finalize、finally 三者区别
java
szarron3 小时前
RF Demo Kit|NanoVNA 射频演示测试板完整上手教程,滤波器、衰减器、SOLT 校准学习板
开发语言·人工智能·学习·php·射频工程·频谱仪
边境悍匪4 小时前
蜗牛学苑 Java 智能体学习 Day39|SpringAI 会话存储、Function‑Call 工具调用、MCP 思维导图复盘
java·开发语言·spring boot·学习·阿里云
302wanger4 小时前
分享一个工作习惯:整点看即时消息
算法
万物智能信息科技4 小时前
RK3568 的多路显示移植—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
linux·开发语言·华为·开源·harmonyos