一、题目要求
使用函数式接口,将一个随机字符串中的所有字符升序排列,并倒序打印。
二、题目答案
1.reverseSort.java
import java.util.Arrays;
import java.util.Comparator;
public class reverseSort {
public static void main(String[] args) {
String str = "aedbc";
Comparator cmp = new reverseChar();
Character[] charObjectArray =
str.chars().mapToObj(c -> (char) c).toArray(Character[]::new);
Arrays.sort(charObjectArray, cmp);
System.out.println(Arrays.toString(charObjectArray));
}
}
2.reverseChar
import java.util.Comparator;
public class reverseChar implements Comparator<Character> {
public int compare(Character o1, Character o2) {
if (o1 < o2) return 1;
else if (o1 > o2) return -1;
else return 0;
}
}
三、题目解析
此题的难点在于如何将字符串转化为包装器类型的数组,并传入sort中。如果在sort中直接传入char[]数组,编译器会发生如下错误:
当sort实现函数式接口功能时,接收的数组类型为泛型,因此传入基本类型char会发生错误,此时需要将char[]转化为Character[]。转化的方法有两种:
1.使用ArrayUtils包,此包不在jdk中,需要额外导入。
String str = "testString";
char[] charArray = str.toCharArray();
Character[] charObjectArray = ArrayUtils.toObject(charArray);
2.使用java8版本的API
String str = "testString";
//[t, e, s, t, S, t, r, i, n, g]
Character[] charObjectArray =
str.chars().mapToObj(c -> (char)c).toArray(Character[]::new);
stackoverflow论坛对此的解释为:
· get an IntStream of the characters (you may want to also look at codePoints())
· map each ‘character’ value to Character (you need to cast to actually say that its really a char, and then Java will box it automatically to Character)
· get the resulting array by calling toArray()
另外需要注意的是直接输出会直接打印地址信息:
[Ljava.lang.Character;@1ddc4ec2
正确的做法需要采用Arrays中的toString方法进行转换。