介绍
在 Java 中,Map 数据结构是一种以键值对形式存储数据的接口。与数组或列表不同,Map 不维护插入顺序,这使得查找最大值更具挑战。本实验将引导你通过不同的方法来查找 Map 中的最大值,这是数据处理应用程序中的常见任务。
你将学习两种主要方法:
- 使用循环比较所有值的迭代方法
- 使用 Collections 工具类的内置方法
在本实验结束时,你将了解如何在 Java Map 中高效地查找极值,这是数据操作任务中必不可少的技能。
理解并创建 Java Map
Java 中的 Map 接口用于存储键值对,其中每个键都是唯一的。在这一步中,我们将创建一个简单的 Map,它将课程名称作为键,对应的价格作为值。
什么是 Java 中的 Map?
Java 中的 Map:
- 包含键值对
- 不能包含重复的键
- 每个键最多可以映射到一个值
- 常用的实现包括 HashMap、TreeMap 和 LinkedHashMap
创建 Java Map 示例
让我们在 WebIDE 中创建一个文件来演示 Map:
- 在 WebIDE 中,创建一个名为
MaxValueInMap.java的新文件。 - 将以下代码复制到文件中:
import java.util.*;
public class MaxValueInMap {
public static void main(String args[]) {
// Create a HashMap to store course prices
Map<String, Integer> coursePrice = new HashMap<>();
// Add key-value pairs to the map
coursePrice.put("Java", 5000);
coursePrice.put("Python", 3000);
coursePrice.put("CPP", 4000);
coursePrice.put("Android", 8000);
// Print the entire map
System.out.println("Course price map: " + coursePrice);
}
}
点击“File” > “Save”或按 Ctrl+S 保存文件。
在 WebIDE 中打开一个终端,并运行以下命令来编译和执行程序:
javac MaxValueInMap.java && java MaxValueInMap
你应该会看到类似于以下的输出:
Course price map: {Java=5000, CPP=4000, Android=8000, Python=3000}
注意,元素的顺序可能与插入顺序不同。这是因为 HashMap 不维护元素的任何特定顺序。
使用迭代方法查找最大值
在 Map 中查找最大值的一种方法是遍历所有条目,并记录到目前为止找到的最大值。这种方法适用于任何 Map 实现。
什么是 Map.Entry?
Map.Entry 是一个接口,它表示 Map 中的一个键值对。它提供了访问键值对中键和值的方法。
实现迭代方法
让我们修改我们的 Java 程序,使用迭代法来查找最高的课程价格:
- 在 WebIDE 中打开
MaxValueInMap.java文件。 - 将现有代码替换为以下代码:
import java.util.*;
public class MaxValueInMap {
public static void main(String args[]) {
// Create a HashMap to store course prices
Map<String, Integer> coursePrices = new HashMap<>();
// Variable to store the entry with maximum price
Map.Entry<String, Integer> maxEntry = null;
// Add key-value pairs to the map
coursePrices.put("Java", 5000);
coursePrices.put("Python", 3000);
coursePrices.put("CPP", 4000);
coursePrices.put("Android", 8000);
System.out.println("Course price map: " + coursePrices);
// Iterate through each entry in the map
for (Map.Entry<String, Integer> entry : coursePrices.entrySet()) {
// If maxEntry is null OR current entry's value is greater than maxEntry's value
if (maxEntry == null || entry.getValue().compareTo(maxEntry.getValue()) > 0) {
maxEntry = entry;
}
}
// Print the maximum price and its corresponding course
System.out.println("Course with maximum price: " + maxEntry.getKey());
System.out.println("Maximum price: " + maxEntry.getValue());
}
}
- 保存文件。
- 使用以下命令运行程序:
javac MaxValueInMap.java && java MaxValueInMap
你应该会看到类似于以下的输出:
Course price map: {Java=5000, CPP=4000, Android=8000, Python=3000}
Course with maximum price: Android
Maximum price: 8000
迭代过程的工作原理
- 我们创建一个
maxEntry变量,初始值设为null。 - 我们使用
entrySet()方法遍历 Map 中的每个条目。 - 对于每个条目,我们将其值与当前的最大值进行比较。
- 如果当前条目的值更大,或者
maxEntry仍然为null,我们就更新maxEntry。 - 完成迭代后,
maxEntry就保存了具有最大值的条目。
当你需要最大值条目的键和值时,这种方法很有用。
使用 Collections.max() 方法查找最大值
Java 提供了一种更简洁的方式,可使用 Collections.max() 方法在集合中查找最大值。此方法可应用于任何集合,包括 Map 的值。
理解 Collections.max()
Collections.max() 方法:
- 以集合作为输入,并返回最大元素
- 使用元素的自然排序或自定义比较器
- 比迭代方法更简洁
- 仅返回最大值,而非其关联的键
对 Map 值实现 Collections.max()
让我们修改程序以使用 Collections.max():
- 在 WebIDE 中打开
MaxValueInMap.java文件。 - 将现有代码替换为以下代码:
import java.util.*;
public class MaxValueInMap {
public static void main(String args[]) {
// Create a HashMap to store course prices
Map<String, Integer> coursePrice = new HashMap<>();
// Add key-value pairs to the map
coursePrice.put("Java", 5000);
coursePrice.put("Python", 3000);
coursePrice.put("CPP", 4000);
coursePrice.put("Android", 8000);
System.out.println("Course price map: " + coursePrice);
// Find maximum value using Collections.max()
Integer maxPrice = Collections.max(coursePrice.values());
System.out.println("Maximum price: " + maxPrice);
// To find the key associated with the maximum value
for (Map.Entry<String, Integer> entry : coursePrice.entrySet()) {
if (entry.getValue().equals(maxPrice)) {
System.out.println("Course with maximum price: " + entry.getKey());
break; // Exit the loop once we find the key
}
}
}
}
- 保存文件。
- 使用以下命令运行程序:
javac MaxValueInMap.java && java MaxValueInMap
你应该会看到类似于以下的输出:
Course price map: {Java=5000, CPP=4000, Android=8000, Python=3000}
Maximum price: 8000
Course with maximum price: Android
Collections.max() 的工作原理
coursePrice.values()方法返回 Map 中所有值的集合视图。Collections.max()在这个集合中查找最大元素。- 然后我们遍历 Map 以找到与该最大值关联的键。
这种方法比之前的迭代方法更简洁,但需要额外的步骤来查找关联的键。
查找 Map 中的最大键
到目前为止,我们主要关注在 Map 中查找最大值。然而,有时你可能需要查找最大键。在键具有自然顺序且有重要意义的场景中,这种需求很常见。
理解 Map 的键和值
在 Map 中:
- 键是唯一标识符
- 值是与每个键关联的数据
- 如果键实现了
Comparable接口,则可以对其进行排序 - 查找最大键使用
keySet()而不是values()
创建以价格为键的 Map
让我们创建一个新示例,其中价格作为键,课程名称作为值:
- 在 WebIDE 中打开
MaxValueInMap.java文件。 - 将现有代码替换为以下代码:
import java.util.*;
public class MaxValueInMap {
public static void main(String args[]) {
// Create a HashMap with prices as keys and course names as values
Map<Integer, String> priceMap = new HashMap<>();
// Add key-value pairs to the map
priceMap.put(5000, "Java");
priceMap.put(3000, "Python");
priceMap.put(4000, "CPP");
priceMap.put(8000, "Android");
System.out.println("Price to course map: " + priceMap);
// Find maximum key using Collections.max()
Integer maxPrice = Collections.max(priceMap.keySet());
System.out.println("Maximum price: " + maxPrice);
System.out.println("Course with maximum price: " + priceMap.get(maxPrice));
// Find minimum key using Collections.min()
Integer minPrice = Collections.min(priceMap.keySet());
System.out.println("Minimum price: " + minPrice);
System.out.println("Course with minimum price: " + priceMap.get(minPrice));
}
}
- 保存文件。
- 使用以下命令运行程序:
javac MaxValueInMap.java && java MaxValueInMap
你应该会看到类似于以下的输出:
Price to course map: {3000=Python, 4000=CPP, 5000=Java, 8000=Android}
Maximum price: 8000
Course with maximum price: Android
Minimum price: 3000
Course with minimum price: Python
此方法的主要区别
- Map 结构反转:现在价格是键,课程名称是值。
- 我们使用
keySet()而不是values()来获取所有键。 - 我们可以使用
get(maxPrice)直接访问相应的值。 - 我们还添加了一个使用
Collections.min()查找最低价格的示例。
当你想要比较的数值已经用作 Map 中的键时,这种方法很有用。
总结
在本次实验中,你学习了几种在 Java Map 中查找最大值的方法:
- 迭代方法:使用循环遍历 Map 条目并比较值。
- 可同时提供最大值及其关联的键
- 适用于任何 Map 实现
- 适用于自定义比较逻辑
- 使用 Collections.max() 查找值:使用内置的
Collections工具来查找最大值。
- 代码比迭代方法更简洁
- 需要额外步骤来查找关联的键
- 使用元素的自然排序
- 使用 Collections.max() 查找键:在 Map 中查找最大键。
- 当键具有有意义的数值时很有用
- 可使用
get()直接访问关联的值 - 也可与
Collections.min()一起使用来查找最小值
这些技术广泛应用于数据处理应用程序、数据库结果处理、统计计算以及许多其他涉及在数据集合中查找极值的编程场景。
当你继续使用 Java 集合时,请记住,你选择的方法应取决于你的具体需求,包括你是否需要键、值或两者,以及是否需要自定义比较逻辑。



