Java中Map和Set练习项目实例代码

 更新时间:2024年11月13日 09:16:23   作者:小川_wenxun  
这篇文章主要给大家介绍了关于Java中Map和Set练习项目的相关资料,首先介绍了如何使用map来统计字符串数组中每个字符串的出现次数,然后讨论了如何使用set来找出只出现一次的数字,最后提出了一个解决坏键盘打字问题的思路,需要的朋友可以参考下

查找字母出现的次数

这道题的思路在后面的题目过程中能用到,所以先把这题给写出来

题目要求:给出一个字符串数组,要求输出结果为其中每个字符串及其出现次数。

思路:我们可以把数组里的字符串按顺序放进map中,对于没被放进去过的字符串,放进去次数为1,之前被放进过去的字符串,那就在其上重新放入,并把次数重新加1.

举个例子,输出的内容是:

"this", "dog", "cat", "cat", "this", "dog"

现在是把每个元素放进去,在没遇到一样数据之前的过程,如是上面所示,如果遇到了一样的数据, 

这个操作看起来可能是把第二个cat放进去了,但是实际上是把cat重新输入了,然后把Key值输入为2了。因为map其中节点的样子如上图所示。

代码部分如下

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Test {
    public static Map<String, Integer> countWords(String[] words){
        Map<String, Integer> map = new HashMap<>();
        for(String word : words){
            if(map.get(word) == null){
                map.put(word, 1);
            }else {
                int val = map.get(word);
                map.put(word, val+1);
            }
        }
        return map;
    }

    public static void main(String[] args) {
        String[] words = {"this", "dog", "cat", "cat", "this", "dog"};
        Map<String, Integer> map = countWords(words);
        Set<Map.Entry<String, Integer>> entryset = map.entrySet();
        for (Map.Entry<String, Integer> entry : entryset){
            System.out.println("Key: " + entry + "  Val: " + entry.getKey());
        }
    }
}

只出现一次的数字

题目链接:只出现一次的数字 - 力扣(LeetCode)

题目描述:给一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

思路:这里的思路和上面的 查找字母出现的次数 有些像。依次把元素放到set中,如果set中没有该元素,就把该元素放进去,如果有,就把这个元素从set中删去。最后输出set中的元素

以 {1,2,3,4,1,2,3} 为例,当第一次往里放,没有遇到重复的元素时,如下图

按照数组的顺序,接着向下放,就会遇到重复的元素,这时候就要把set中的元素给删除了

 后面的2,3也要依次从set中删除。

public static int singleNumber(int[] nums){
        HashSet<Integer> set = new HashSet<>();
        for (int i = 0; i < nums.length; i++) {
            if(set.contains(nums[i])){
                set.remove(nums[i]);
            }else{
                set.add(nums[i]);
            }
        }

        for (int i = 0; i < nums.length; i++) {
            if(set.contains(nums[i])){
                return nums[i];
            }
        }
        return -1;
    }

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

运行结果如下

坏键盘打字

题目链接:

题目描述:旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。

输入在两行中分别给出应该输入的文字、以及实际输入的文字

按照发现顺序,在一行中输出坏掉的键。其中英语字母只输出大写,每个坏键只输入一次。

示例

输入

7_This_is_a_test

_hs_s_a_es

输出

7TI

题目思路:该题的思路在于如何找出坏键,这里提供一种思路,先把实际输入的数据放到set中,然后再把应该输入的文字遍历一遍,如果其中有set中没有的数据,那些没有的数据便是坏掉的键。

public static void func(String str1, String str2){
        //将字符串大写
        str1 = str1.toUpperCase();
        str2 = str2.toUpperCase();

        HashSet<Character> setAct = new HashSet<>();
        for (int i = 0; i < str2.length(); i++) {
            char ch = str2.charAt(i);
            setAct.add(ch);
        }

        for (int i = 0; i < str1.length(); i++) {
            char ch = str1.charAt(i);
            if(!setAct.contains(ch)){

                System.out.print(ch);
            }
        }
    }

    public static void main(String[] args) {
        func("7_This_is_a_test", "_hs_s_a_es");
    }

这样的代码还是存在问题,没办法把其中重复出现的元素给消去,输出的结果是

现在问题变成了如何去重,这部分不难能想到,我们可以创建一个setBroken来存放已经查找到的坏键,如果set和setBroken中都没有这个元素才打印.

public class Test {
    public static void func(String str1, String str2){
        str1 = str1.toUpperCase(Locale.ROOT);
        str2 = str2.toUpperCase(Locale.ROOT);

        HashSet<Character> setAct = new HashSet<>();
        for (int i = 0; i < str2.length(); i++) {
            char ch = str2.charAt(i);
            setAct.add(ch);
        }

        //第一步是把不同的数给挑出来,然后对于重复输出的数据给去重
        HashSet<Character> setBroken = new HashSet<>();
        for (int i = 0; i < str1.length(); i++) {
            char ch = str1.charAt(i);
            if(!setAct.contains(ch) && !setBroken.contains(ch)){
                setBroken.add(ch);
                System.out.print(ch);
            }
        }
    }

    public static void main(String[] args) {
        func("7_This_is_a_test", "_hs_s_a_es");
    }
}

输出结果为

总结

到此这篇关于Java中Map和Set练习项目的文章就介绍到这了,更多相关Java Map和Set练习内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决IDEA无法读取maven镜像,jar包下载失败的问题

    解决IDEA无法读取maven镜像,jar包下载失败的问题

    这篇文章主要介绍了解决IDEA无法读取maven镜像,jar包下载失败的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Spring中常用注解的用法

    Spring中常用注解的用法

    这篇文章主要介绍了Spring中常用注解的用法,Spring注解方式减少了配置文件内容,更加便于管理,并且使用注解可以大大提高了开发效率,注解本身是没有功能的,和xml一样,注解和xml都是一种元数据,元数据即解释数据的数据,也就是所谓的配置,需要的朋友可以参考下
    2023-08-08
  • SpringCloud将Nacos作为配置中心实现流程详解

    SpringCloud将Nacos作为配置中心实现流程详解

    这篇文章主要介绍了Springcloud中的Nacos Config服务配置,本文以用户微服务为例,进行统一的配置,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • 如何在Java中调用python文件执行详解

    如何在Java中调用python文件执行详解

    丰富的第三方库使得python非常适合用于进行数据分析,最近在项目中就涉及到java调用python实现的算法,下面这篇文章主要给大家介绍了关于如何在Java中调用python文件执行的相关资料,需要的朋友可以参考下
    2022-05-05
  • SMBMS超市订单管理系统的网站源码

    SMBMS超市订单管理系统的网站源码

    这篇文章主要介绍了SMBMS超市订单管理系统,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • Java深入探究Object类的方法

    Java深入探究Object类的方法

    java继承中说到的Object类是java中一个特殊的类,所有的类都是直接或者间接的继承自Object类,即如果某个类没有使用extends关键字则默认是java.lang.Object类的子类,所以所有的类都可以使用Object类中定义的方法,下面介绍Object类的常用方法
    2022-05-05
  • 浅谈JAVA8给我带了什么——流的概念和收集器

    浅谈JAVA8给我带了什么——流的概念和收集器

    这篇文章主要介绍了JAVA8流的概念和收集器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Java将String字符串带括号转成List的简单方法

    Java将String字符串带括号转成List的简单方法

    Java中我们有时需要对现有的字符串进行切割并转化成一个List集合,这篇文章主要给大家介绍了关于Java将String字符串带括号转成List的简单方法,需要的朋友可以参考下
    2023-03-03
  • 非常全面的Java异常处理(全文干货,值得收藏)

    非常全面的Java异常处理(全文干货,值得收藏)

    这篇文章主要给大家介绍了非常全面的Java异常处理的相关资料,全文干货,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Spring笔记-@Order注解和Ordered接口解析

    Spring笔记-@Order注解和Ordered接口解析

    这篇文章主要介绍了Spring笔记-@Order注解和Ordered接口,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08

最新评论