`

由一道java题的思考和引申

    博客分类:
  • Java
阅读更多

题目:

用程序产生10个随机数,序号从1到10,然后对这10个数进行从小到大排序,并输出这10个数和相对应的序号


解决方案:

一、数组法
使用两个数组,分别存储随机数和序号,按随机数排序同时移动序号数组。但是需要自己写排序法(如冒泡法),在java环境下自己写排序法是不高明的,而且同时移动两个数组效率也不高。

二、Map法
key为随机数,value为序号。但是随机数相同即生成相同的key(违反Map定义)则会产生麻烦。

三、字符串法(自己想的名字,呵呵)
思路:将随机数和序号组成字符串(如随机数78序号1->78:1),将所有随机数放入List中,然后重写Collection.sort()方法,截取字符串的第0位到":",按照数字排序即可。代码如下:


思考过程:

第一种方法应该是大家最先想到的,使用数组存储数据,然后使用各种排序法进行排序,其实此题的关键处不只是排序,而是另一个关键点建立关联,即集合A(随机数)与集合B(序号)的一一对应关系。

因此大多数人会想到第二种方法,使用Map的key-value对应关系,但是将谁设置为key呢,首先将随机数设置为key,这样可以将随机数排序后,通过Map.get()方法获得对应的序号,到此感觉大功告成了,其实忽略了一个问题,就是潜意识中认为随机数的产生不会出现重复(随机数重复是很有可能形成的),所以当随机数重复时,违反了map的定义,Java会将原来的值(序号)覆盖掉,产生错误。那让序号作为key呢(我们不愿意放弃这个现成的集合对应数据结构Map),序号肯定是不会重复的(从1到10嘛),将value排序吧,然后通过value找到对应的序号,感觉没问题了,那我们再来讨论一下重复随机数的问题,value允许重复,但是能通过重复的value找到对应key吗,肯定是不行了,通过java提供的方法也可以证明这一点,只有Map.get(key);方法得到value,没有Map.get(value);得到key的。Map暂时放弃了!

既然关键点在于建立关联,那还不如就把随机数和序号放一起呢,这样就避免了关联的这个关键点,使用字符串就OK了,只排序字符串就可以了,但是字符串的排序是按照ASCII排序的所以9会排在10的后面,所以需要重写Collection.sort()方法,截取字符串的第0位到":",按照数字规则排序即可,这就是第三种方法。


引申:

Map的针对性与集合

这道题表面上是一对一的关系,其实它隐藏的却是一个多对一的关系,即多个序号对应一个随机数(假设集合中没有重复的元素),所以导致的Map的失效。

那有什么可以实现这个一对多的功能呢?

未完待续......


分享到:
评论

相关推荐

    javascript 思考题.md

    思考题不多,但是其实每一道思考题背后都可以引申出很多内容,大家接下去在学习的过程中也应该始终有一个意识,你学习的这块内容到底和你现在脑海里的哪一个知识点有关联。

    c语言数据类型引申和思考

    在“数据类型引申和思考”这个主题中,我们将深入探讨C语言的数据类型及其应用。 首先,C语言的基本数据类型包括整型(如int)、浮点型(如float和double)、字符型(char)以及布尔型(在标准库中的stdbool.h中...

    一个Java框架引发的思考:语言、框架、范式转换和软件生产力

    标题中的“一个Java框架引发的思考:语言、框架、范式转换和软件生产力”提示了本文将探讨一个特定的Java框架,并由此引申出关于编程语言、开发框架、编程范式以及它们如何影响软件开发效率的主题。从描述中提供的...

    JAVA实现扫描线算法(超详细)

    JAVA实现扫描线算法的优点是可以避免使用指针,可以使用对象数组和Node类来构造类似数组+指针的数据结构,代码更加简洁易懂。同时,JAVA实现扫描线算法也可以更好地支持多边形的填充和绘制。 7. JAVA实现扫描线算法...

    java基础练习题,无答案,基础。

    以下是一些由题目所引申出的关键知识点: 1. **标识符命名规则**:Java中的标识符用于变量、类、方法等的命名。根据题目中的选项,我们可以看出,合法的标识符不能以数字开头,因此选项D (112) 不合法。Java允许...

    使用Java 语言理解程序逻辑

    Java作为一门高级编程语言,由Sun Microsystems在1995年推出,其JavaSE和JavaEE技术在应用软件开发领域占据重要地位,与C#和.NET平台并驾齐驱。 Java技术的应用广泛,不仅可用来开发桌面应用程序,如银行软件、商场...

    2020届高考语文人生哲理篇写作素材《一道受用终身的测试题》.doc

    标题中的“2020届高考语文人生哲理篇写作素材《一道受用终身的测试题》”指的是一份用于高考语文复习的人生哲理类写作素材,它以一道假设性的问题来引发思考,旨在帮助学生理解并运用人生哲理进行论述。这道测试题是...

    依托“深度学习” 培养核心素养——从天体运动的一道习题谈起.pdf

    综上所述,本文通过剖析一道天体运动的物理题,详细地阐释了深度学习在培养学生核心素养中的作用。教师不仅需要教会学生知识,更要教会学生如何思考、分析问题,这样才能使学生在未来的学术研究或职业工作中,能够...

    棋盘覆盖Java源码

    在IT领域,棋盘覆盖问题是一个经典的算法问题,它涉及...通过学习这个Java源码,开发者可以深入理解分治算法的原理,掌握递归和回溯技术,同时提高解决问题和调试代码的能力。这对于提升算法设计和编程技能非常有帮助。

    成都四方伟业JAVA笔试题-notebook:你好2019

    成都四方伟业JAVA笔试题 面试,你准备好了么?:balloon: :Christmas_tree: 今天学点啥 :wolf: 简历制作 :gorilla: 学习资料整理 :banana: 公众号 (排名不分先后) 石杉的架构笔记 工匠小猪猪的技术世界 程序员私房菜 ...

    基于jmeter+Java+HttpclientUtil实现的接口测试工具

    基于jmeter+Java+HttpclientUtil实现的接口测试工具,通过Excel表格进行维护接口相关参数信息,借助Jmeter工具通过java请求设计接口测试自动化测试用例。代码重写了JavaSampleClient类,在使用过程中取出了冗余的...

    古汉语词义引申的方式.doc

    连锁式引申,又称链条式引申,是指词义由本义逐渐发展至直接引申义,再到间接引申义,如同链条般逐环递进。以“要”为例,它的本义是“腰”,经过一系列的引申,扩展到了“中间”、“拦截”、“要挟”、“求得”和...

    阿里java开发手册1.3.0版

    《阿里巴巴 Java 开发手册》是阿里巴巴集团技术团队的集体经验...对于规约条目的延伸信息中,“说明”对内容做了引申和解释;“正例”提 倡什么样的编码和实现方式; “反例”说明需要提防的雷区,以及真实的错误案例。

    java synchronize 线程同步

    Java中的`synchronized`关键字是用于实现线程同步的关键机制,主要目的是解决多线程环境下的数据安全问题。当多个线程访问共享资源时,如果没有适当的同步控制,可能会导致数据不一致或者竞态条件等问题。线程同步...

    切比雪夫逼近问题:从一道中国台北数学奥林匹克试题谈起

    本书适合数学专业的本科生和研究生以及数学爱好者阅读和收藏。 目录 第0章 引言 第1章 切比雪夫小传 第2章什么是逼近 第3章 切比雪夫多项式 第4章 切比雪夫多项式与方程根的分布 第5章 最佳逼近多项式的特征 第6章 ...

    java试卷(20211003223530).pdf

    在2021年的这份数字化试卷中,虽然主要探讨的是Linux操作系统内核编译,但我们可以从中引申出Java在系统编程领域的相关知识。 在Java中,虽然不像C或C++那样可以直接操作硬件和内核,但Java提供了Java Native ...

    NOIP2015普及组初赛Pascal试题

    8. 信息学竞赛对教育的贡献:NOIP这样的信息学竞赛能够激发学生的求知欲和探索精神,让学生在解决问题的过程中学会独立思考和创新。它不仅能够帮助学生建立起对计算机科学的兴趣,还能够提高他们的逻辑思维和分析...

    历年考研英语真题翻译长难句汇编.doc

    这一点可以引申出科学研究的重要性,即科学研究需要细致、谨慎和反复的思考和观察。 最后,文章中还提到,Darwin认为,在深入理解冗长且完全抽象的一系列观点方面,自己的能力非常有限。这一点可以引申出学习和研究...

Global site tag (gtag.js) - Google Analytics