您的位置:首页 > 编程语言

这些问题你可以用一行代码可以搞定吗?

2010-01-03 15:02 344 查看
A.编写一个方法,它接受一个包含元素的List,并返回一个新的List,

它以相同的顺序包含相同的元素,只不过它把第二次以及后续出现的重复

元素都剔除了。例如,如果你传递了一个包

含”spam”,”sausage”,”spam”,”spam”,”bacon”,”spam”,”t

omato”和”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]。了解类库中有些什么

可以节省你大量的时间和精力,并且可以提高你的程序的速度和质量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: