map
Map是Java中的一个接口,用于存储键值对(key-value pair)的集合。它提供了一种通过键(key)快速访问值(value)的方式,并且不允许键的重复(每个键最多只能对应一个值)。Map接口在Java的集合框架中属于顶层接口,常见的实现类有HashMap、TreeMap、LinkedHashMap等。
Map的常用方法包括:
1.put(key, value): 向Map中添加键值对。
2.get(key): 根据键获取对应的值。
3.containsKey(key): 判断Map是否包含指定的键。
4.containsValue(value): 判断Map是否包含指定的值。
5.remove(key): 删除Map中指定键对应的键值对。
6.size(): 返回Map中键值对的数量。
7.keySet(): 返回Map中所有键的集合。
8.values(): 返回Map中所有值的集合。
9.entrySet(): 返回Map中所有键值对(Entry)的集合。
练习内容
1.使用Map接口的实现类完成员工工资(姓名–工资)的摸拟: (1)添加几条信息 (2)列出所有的员工姓名 (3)列出所有员工姓名及其工资 (4)删除名叫“Tom”的员工信息 (5)输出Jack的工资,并将其工资加1000元(通过取值实现) (6)将所有工资低于1000元的员工的工资上涨20%(通过取值实现)
import java.util.HashMap;
import java.util.Map;
public class EmployeeSalary {
public static void main(String[] args) {
// 创建Map对象保存员工姓名和工资
Map<String, Integer> salaryMap = new HashMap<>();
// 添加几条信息
salaryMap.put("Tom", 5000);
salaryMap.put("Jack", 6000);
salaryMap.put("Alice", 7000);
salaryMap.put("John", 4500);
// 列出所有的员工姓名
System.out.println("所有员工姓名:");
for (String name : salaryMap.keySet()) {
System.out.println(name);
}
// 列出所有员工姓名及其工资
System.out.println("\n所有员工姓名及其工资:");
for (Map.Entry<String, Integer> entry : salaryMap.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
// 删除名叫“Tom”的员工信息
salaryMap.remove("Tom");
// 输出Jack的工资,并将其工资加1000元
int jackSalary = salaryMap.get("Jack");
System.out.println("\nJack的工资:" + jackSalary);
salaryMap.put("Jack", jackSalary + 1000);
System.out.println("加薪后Jack的工资:" + salaryMap.get("Jack"));
// 将所有工资低于1000元的员工的工资上涨20%
for (String name : salaryMap.keySet()) {
int salary = salaryMap.get(name);
if (salary < 1000) {
salaryMap.put(name, (int) (salary * 1.2));
}
}
// 打印所有员工姓名及其工资(包括上涨后的工资)
System.out.println("\n所有员工姓名及其工资(包括上涨后的工资):");
for (Map.Entry<String, Integer> entry : salaryMap.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
}
2.使用HashMap类实例化一个Map类型的对象m1,键(String类型)和值(int型)分别用于存储员工的姓名和工资,存入数据如下:
张三——800元;李四——1500元;王五——3000元;
1)将张三的工资更改为2600元
2)为所有员工工资加薪100元;
3)遍历集合中所有的员工
4)遍历集合中所有的工资
5)对员工按照工资进行排序
import java.util.*;
public class EmployeeMapExample {
public static void main(String[] args) {
// 实例化HashMap对象m1
Map<String, Integer> m1 = new HashMap<>();
// 存储员工的姓名和工资
m1.put("张三", 800);
m1.put("李四", 1500);
m1.put("王五", 3000);
// 1)将张三的工资更改为2600元
m1.put("张三", 2600);
// 2)为所有员工工资加薪100元
for (String key : m1.keySet()) {
int salary = m1.get(key);
m1.put(key, salary + 100);
}
// 3)遍历集合中所有的员工
System.out.println("所有员工的姓名:");
for (String key : m1.keySet()) {
System.out.println(key);
}
// 4)遍历集合中所有的工资
System.out.println("所有员工的工资:");
for (int salary : m1.values()) {
System.out.println(salary);
}
// 5)对员工按照工资进行排序
List<Map.Entry<String, Integer>> sortedList = new ArrayList<>(m1.entrySet());
Collections.sort(sortedList, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> entry1, Map.Entry<String, Integer> entry2) {
return entry1.getValue().compareTo(entry2.getValue());
}
});
System.out.println("按工资排序的员工信息:");
for (Map.Entry<String, Integer> entry : sortedList) {
String name = entry.getKey();
int salary = entry.getValue();
System.out.println("姓名:" + name + ",工资:" + salary);
}
}
}
3.利用已学集合知识,选择合适的结构完成简易学生管理系统,要求实现:增删改查功能《并注明为何使用该结构》
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class StudentManagementSystem {
private Map<Integer, String> studentMap;
public StudentManagementSystem() {
studentMap = new HashMap<>();
}
public void addStudent(int id, String name) {
studentMap.put(id, name);
}
public void removeStudent(int id) {
studentMap.remove(id);
}
public void updateStudent(int id, String newName) {
studentMap.put(id, newName);
}
public String findStudent(int id) {
return studentMap.get(id);
}
public void printAllStudents() {
System.out.println("学生列表:");
for (Map.Entry<Integer, String> entry : studentMap.entrySet()) {
System.out.println("学生ID:" + entry.getKey() + ",姓名:" + entry.getValue());
}
}
public static void main(String[] args) {
StudentManagementSystem system = new StudentManagementSystem();
Scanner scanner = new Scanner(System.in);
boolean running = true;
while (running) {
System.out.println("\n请选择操作:");
System.out.println("1. 添加学生");
System.out.println("2. 删除学生");
System.out.println("3. 更新学生信息");
System.out.println("4. 查找学生");
System.out.println("5. 显示所有学生");
System.out.println("0. 退出系统");
int choice = scanner.nextInt();
switch (choice) {
case 1:
System.out.println("请输入学生ID:");
int id = scanner.nextInt();
System.out.println("请输入学生姓名:");
String name = scanner.next();
system.addStudent(id, name);
System.out.println("添加成功!");
break;
case 2:
System.out.println("请输入要删除的学生ID:");
int idToDelete = scanner.nextInt();
system.removeStudent(idToDelete);
System.out.println("删除成功!");
break;
case 3:
System.out.println("请输入要更新的学生ID:");
int idToUpdate = scanner.nextInt();
System.out.println("请输入新的学生姓名:");
String newName = scanner.next();
system.updateStudent(idToUpdate, newName);
System.out.println("更新成功!");
break;
case 4:
System.out.println("请输入要查找的学生ID:");
int idToFind = scanner.nextInt();
String foundStudent = system.findStudent(idToFind);
if (foundStudent != null) {
System.out.println("学生ID:" + idToFind + ",姓名:" + foundStudent);
} else {
System.out.println("未找到对应的学生!");
}
break;
case 5:
system.printAllStudents();
break;
case 0:
System.out.println("感谢使用学生管理系统,再见!");
running = false;
break;
default:
System.out.println("无效的操作!");
break;
}
}
scanner.close();
}
}
4.封装一个新闻类News,包含新闻标题,新闻作者,新闻内容,新闻类型三个属性,提供必要的访问器和修改器方法,重写toString方法,要求打印对象时输出格式为“标题;类型;作者”,要求只要新闻标题相同就判断为同一条新闻。在测试类中创建一个只能容纳该类对象的ArrayList集合,添加三条新闻。遍历集合,打印新闻标题,将新闻标题截取字符串到10个汉字的长度。
import java.util.ArrayList;
import java.util.List;
public class News {
private String title;
private String author;
private String content;
private String type;
public News(String title, String author, String content, String type) {
this.title = title;
this.author = author;
this.content = content;
this.type = type;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String toString() {
return title + ";" + type + ";" + author;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
News news = (News) obj;
return title.equals(news.title);
}
@Override
public int hashCode() {
return title.hashCode();
}
public static void main(String[] args) {
List<News> newsList = new ArrayList<>();
// 添加三条新闻
newsList.add(new News("中国队获得冠军", "记者A", "中国队在国际比赛中荣获冠军", "体育"));
newsList.add(new News("新科技改变生活", "记者B", "新科技正在改变人们的生活方式", "科技"));
newsList.add(new News("财经界大佬出访", "记者C", "财经界大佬出访推动经济合作", "财经"));
// 遍历集合,打印新闻标题并截取为10个汉字长度
for (News news : newsList) {
System.out.println(news.getTitle().substring(0, Math.min(10, news.getTitle().length())));
}
}
}
5.开发一个泛型Apple类,要求有一个重量属性weight在测试类中实例化不同的泛型对象,要求对象a1的这一属性是String类型,对象a2的这一属性是Integer型,a3的这一属性是Double型。分别为a1,a2,a3的重量属性赋值为:”500克”,500,500.0,在测试类中通过对象调用访问器得到属性值并输出。另外思考,为什么a2和a3的属性需要是Integer和Double而不是int和double?
public class Apple<T> {
private T weight;
public T getWeight() {
return weight;
}
public void setWeight(T weight) {
this.weight = weight;
}
public static void main(String[] args) {
Apple<String> a1 = new Apple<>();
a1.setWeight("500克");
System.out.println(a1.getWeight());
Apple<Integer> a2 = new Apple<>();
a2.setWeight(500);
System.out.println(a2.getWeight());
Apple<Double> a3 = new Apple<>();
a3.setWeight(500.0);
System.out.println(a3.getWeight());
}
}
希望这篇文章会帮助到大家,不懂的也可以私信我。