面向对象程序设计实践(Java)作业2

这篇博客主要解析了面向对象编程的Java作业,包括查词典、集合运算、Blackjack游戏、雇员类设计和正则表达式的最大匹配最小匹配问题。通过实例详细解释了HashMap、Scanner的split和equals方法的使用,以及如何遍历和操作集合。此外,还介绍了Set接口的HashSet和TreeSet的区别与应用,以及重写toString方法的意义。最后,讲解了Java中如何实现最小匹配和贪婪匹配的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题 A: 查词典

时间限制 : 1.000 sec  内存限制 : 128 MB

题目描述

现在有一本将汪星人语言翻译成喵星人语言的词典,请你写一段查该词典的程序。

输入格式

第一行为一个整数n(0<n<=1000),后边是n行,每行均为两个用空格分隔的字符串,前边的字符串代表喵星人的单词,后边的字符串代表汪星人的单词,而且在词典中不会有某个汪星人的单词出现两次或两次以上。从第n+2行开始有若干行(行数大于1且小于等于1000),每行均为一个字符串,代表汪星人语言的文档,该文档最后一行一定是dog。
测试用例保证1、输入中出现所有单词都只包含小写字母,而且长度不会超过10;2、输入中只会在最后一行出现一次dog。

输出格式

在输出中,你需要把输入文档翻译成喵星人语言,每行输出一个喵星人单词。如果某个汪星人单词不在词典中,就把这个单词翻译成“dog”。

样例输入

3
mmm www
m w
mm ww
ww
wwww
w
dog

样例输出

mm
dog
m

答:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner inputScanner = new Scanner(System.in);

        // 读取词典
        int numOfLines = inputScanner.nextInt();
        inputScanner.nextLine(); // 读取换行符
        Map<String, String> WToMDictionary = new HashMap<>();
        for (int i = 0; i < numOfLines; i++) {
            String[] line = inputScanner.nextLine().split(" ");
            WToMDictionary.put(line[1], line[0]);
        }

        // 翻译文档
        String line;
        while (!(line = inputScanner.nextLine()).equals("dog")) {
            String[] words = line.split(" ");
            for (String word : words) {
                String translation = WToMDictionary.getOrDefault(word, "dog");
                System.out.println(translation);
            }
        }

        inputScanner.close();
    }
}

Keys:

1. Maps:
Maps是Java中的一种数据结构,用于存储键值对。它提供了快速的查找和访问能力。常见的Map实现类有HashMap、TreeMap和LinkedHashMap。使用Map可以通过键来访问对应的值,而且键是唯一的,不会重复。

一般用法:
- 存储和获取数据:使用`put(key, value)`方法将键值对添加到Map中,然后使用`get(key)`方法通过键来获取对应的值。
- 遍历Map:可以使用`entrySet()`方法获取Map中的键值对集合,然后使用`for-each`循环遍历每个键值对。
- 判断键是否存在:使用`containsKey(key)`方法可以检查Map中是否包含指定的键。
- 删除键值对:使用`remove(key)`方法可以从Map中删除指定的键值对。

2. Scanner的split 和 equals:
- Scanner是Java中用于读取输入的类,它可以从各种来源(如键盘、文件等)读取数据。使用Scanner可以方便地读取不同类型的输入,如整数、浮点数和字符串。
- split是字符串类的一个方法,用于将字符串拆分成子字符串。可以指定一个分隔符,将原始字符串按照分隔符进行拆分,并返回一个字符串数组。

// 可以把以空格分隔的一行内容依次读入
String[] line = inputScanner.nextLine().split(" ");
// 可以把形如08:00的时间直接拆成小时,分钟
String[] line = inputScanner.nextLine().split(":");


- equals是Java中用于比较两个对象是否相等的方法。它可以用于比较两个字符串、两个对象或其他可比较的类型。equals方法通常与条件语句(如if语句)一起使用,用于判断两个对象是否相等。

一般用法:
- 使用split拆分字符串:使用`split(delimiter)`方法,将一个字符串按照指定的分隔符进行拆分,并返回一个字符串数组。可以使用数组的每个元素进行进一步的处理。
- 使用equals比较对象:使用equals方法比较两个对象是否相等,可以通过`object1.equals(object2)`的方式进行比较。各种数据类型均可采用本格式进行相同与否的比较。注意,在使用equals方法比较字符串时,应该使用`str1.equals(str2)`,而不是使用`str1 == str2`进行比较。

3. for循环遍历集合:
- 遍历集合:通过结合使用`for-each`循环和集合类(如List、Set等),可以方便地遍历集合中的元素。

List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");

for (String name : names) {
    System.out.println(name);
}

问题 B: 集合运算

时间限制 : 1.000 sec  内存限制 : 128 MB

题目描述

给出两个整数集合A、B,求出他们的交集、并集以及B在A中的余集。

输入格式

  第一行为一个整数n,表示集合A中的元素个数。
  第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素。
  第三行为一个整数m,表示集合B中的元素个数。
  第四行有m个互不相同的用空格隔开的整数,表示集合B中的元素。
  集合中的所有元素均为int范围内的整数,n、m<=1000。

输出格式

  第一行按从小到大的顺序输出A、B交集中的所有元素。
  第二行按从小到大的顺序输出A、B并集中的所有元素。
  第三行按从小到大的顺序输出B在A中的余集中的所有元素。

样例输入

5
1 2 3 4 5
5
2 4 6 8 10

样例输出

2 4
1 2 3 4 5 6 8 10
1 3 5

答:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        // 读取集合A
        int numberInA = input.nextInt();
        Set<Integer> setA = new HashSet<>();
        for (int i = 0; i < numberInA; i++) {
            int element = input.nextInt();
            setA.add(element);
        }

        // 读取集合B
        int numberInB = input.nextInt();
        Set<Integer> setB = new HashSet<>();
        for (int i = 0; i < numberInB; i++) {
            int element = input.nextInt();
            setB.add(element);
        }

        // 使用StringBuilder优化输出
        StringBuilder output = new StringBuilder();

        // 计算交集
        Set<Integer> intersection = new TreeSet<>(setA);
        intersection.retainAll(setB);
        for (int element : intersection) {
            output.append(element).append(" ");
        }
        System.out.println(output.toString());
        output.setLength(0); // 重置StringBuilder对象

        // 计算并集
        Set<Integer> union = new TreeSet<>(setA);
        union.addAll(setB);
        for (int element : union) {
            output.append(element).append(" ");
        }
        System.out.println(output.toString());
        output.s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值