出自《java puzzle》
现在该轮到你写一些代码了。下面的谜题每一个都可以用一个方法来解决,这些方法的方法体都只包含一行代码。各就各位,预备,编码!
• A.编写一个方法,它接受一个包含元素的List,并返回一个新的List,它以相同的顺序包含相同的元素,只不过它把第二次以及后续出现的重复元素都剔除了。例如,如果你传递了一个包含”spam”,”sausage”,”spam”,”spam”,”bacon”,”spam”,”tomato”和”spam”的列表,那么你将得到一个包含”spam”,”sausage”,”bacon”,”tomato”的新列表。
• B.编写一个方法,它接受一个由0个或多个由逗号分隔的标志所组成的字符串,并返回一个表示这些标志的字符串数组,数组中的元素的顺序与这些标志在输入字符串中出现的顺序相同。每一个逗号后面都可能会跟随0个或多个空格字符,这个方法忽略它们。例如,如果你传递的字符串是”fear, surprise, ruthless efficiency, an almost fanatical devotion to the Pope, nice red uniforms”,那么你得到的将是一个包含5个元素的字符串数组,这些元素是”fear”,”surprise”,”ruthless efficiency”,”an almost fanatical devotion to the Pope” 和 “nice red uniform”。
• C.假设你有一个多维数组,出于调试的目的,你想打印它。你不知道这个数组有多少级,以及在数组的每一级中所存储的对象的类型。编写一个方法,它可以向你显示出在每一级上的所有元素。
• D.编写一个方法,它接受两个int数值,并在第一个数值与第二个数值以二进制补码形式进行比较,具有更多的位被置位时,返回true。
A.众所周知,你可以通过把集合(collection)中的元素置于一个Set中将集合中的所有重复元素都消除掉。在本谜题中,你还被要求要保持最初的集合中的元素顺序。幸运的是,有一种Set的实现可以维护其元素被插入的顺序,它提供的导入性能接近HashMap。它就是LinkedHashSet,它是在1.4版本的JDK中被添加到Java平台中的。在内部,它是用一个链接列表来处理的,从而被实现为一个散列表。它还有一个映射表版本可供你使用,以定制缓存。一旦你了解了LinkedHashSet,本谜题就很容易解决了。剩下唯一的关键就是你被要求要返回一个List,因此你必须用LinkedHashSet的内容来初始化一个List。把它们放到一块,就形成了下面的解决方案:
static <E> List<E> withoutDuplicates(List<E> original) {
return new ArrayList<E>(new LinkedHashSet<E>(original));
}
B.在将字符串解析成标志时,许多程序员都立刻想到了使用StringTokenizer。这是最不幸的事情,自1.4版本开始,由于正则表达式被添加到了Java平台中(java.util.regex),StringTokenizer开始变得过时了。如果你试图通过StringTokenizer来解决本谜题,那么你很快就会意识到它不是非常适合。通过使用正则表达式,它就是小菜一碟。为了在一行代码中解决本谜题,我们要使用很方便的方法String.split,它接受一个描述标志分界符的正则表达式作为参数。如果你以前从来没有使用过正则表达式,那么它们看起来会显得有一点神秘,但是它们惊人地强大,值得我们好好学习一下:
static String[ ] parse(String string) {
return string.split(",\\S*");
}
C.这是一个讲究技巧的问题。你甚至不必去编写一个方法。这个方法在5.0或之后的版本中已经提供了,它就是Arrays.deepToString。如果你传递给它一个对象引用的数组,它将返回一个精密的字符串表示。它可以处理嵌套数组,甚至可以处理循环引用,即一个数组元素直接或间接地引用了其嵌套外层的数组。事实上,5.0版本中的Arrays类提供了一整套的toString、equals和hashCode方法,使你能够打印、比较或散列任何原始类型数组或对象引用数组的内容。
D.为了在一行代码中解决该谜题,你需要了解在5.0版本中添加到Java平台中的一整套位操作方法。整数类型的包装器类(Integer、Long、Short、Byte和Char)现在支持通用的位处理操作,包括highestOneBit、lowestOneBit、numberOfLeadingZeros、numberOfTrailingZeros、bitCount、rotateLeft、rotateRight、reverse、signum和reverseBytes。在本例中,你需要的是Integer.bitCount,它返回的是一个int数值中被置位的位数:
static Boolean hasMoreBitsSet(int i, int j) {
return (Integer.bitCount(i) > Integer.bitCount(j));
}
总之,Java平台的每一个主版本都在其类库中隐藏了一些宝藏。本谜题的所有4个部分都依赖于这样的宝藏。每当该平台发布一个新版本时,你都应该研究就一下新特性和提高(new features and enhancements)页面,这样你就不会遗漏掉新版本提供的任何惊喜[Features-1.4, Features-5.0]。了解类库中有些什么可以节省你大量的时间和精力,并且可以提高你的程序的速度和质量。
分享到:
相关推荐
今天小编就为大家分享一篇根据DataFrame某一列的值来选择具体的某一行方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
下面小编就为大家带来一篇利用jquery给指定的table动态添加一行、删除一行的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
SQL方法,将一列中的多行变为一行,将按一定条件筛查出来的多行数据变为一行数据
因此,将点击按钮添加一行标签的方法,修改为如下: $("#addTable").click(function(){ var tr=" <tr>"+ " <td data-field='domainId' data-edit='text'> ...
昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个列的多行内容拼接成一行,比如表中有两列数据 : 类别 名称 AAA 企业1 AAA 企业2 AAA 企业3 ...
用于CAD与excel批量数据的相互转换,还可以用作地质CAD钻孔柱状图。
VBA获取二维数组的一行或一列,不用遍历的方法,直接取出多维数组的一行或一列
主要介绍了C#实现改变DataGrid某一行和单元格颜色的方法,主要涉及DataGrid控件的添加与使用、数据源的绑定、单元格与行的获取等操作。需要的朋友可以参考下
word中将奇数行和偶数行合并成一行的方法技巧.docx
matlab中实现矩阵删除一行或一列的方法matlab中实现矩阵删除一行或一列的方法
用excel表里的B列批量替换A列的文件名一行一行的自动重命名的方法
相信好多人经常碰到这样一个问题:客户要求去除新闻列表最后一行的下划线 怎么处理?相信之前很多懒人都是用js实现的,但这相当麻烦,而且如果网速慢的话会出现闪一下的效果,想必非常的不理想。 下面就给...
Pandas DataFrame 取一行数据会得到Series的方法 如题,想要取如下dataframe的一行数据,以为得到的还是dataframe lista = [1, 3, 7,4,0] listb = [3, 3, 4,4,5] listc = [3, 3, 4,4,6] df1 = pd.DataFrame({'col1'...
删除表指定行的方法。。。。。。。。。。。。。。。。
以上这篇python之文件读取一行一行的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:python 读取文本文件的行数据,文件.splitlines()的方法python...
[Swfit 3.0]一个方法一行代码实现表视图缩放
主要介绍了php循环table实现一行两列显示的方法,本文直接给出实现代码,重点就是在取余方法的运用,需要的朋友可以参考下