来自Java Collections Framework的Java教程的练习要求使用SortedSet来消除参数的重复,并指定Comparator,以便在排序和识别set元素时忽略大小写。
这是确切的要求: “取FindDupsexample并修改它以使用SortedSet而不是Set。指定一个Comparator,以便在排序和识别set元素时忽略大小写。”
这是FindDupsExample:
import java.util.*;
public class FindDups {
public static void main(String[] args) {
Set<String> s = new HashSet<String>();
for (String a : args)
s.add(a);
System.out.println(s.size() + " distinct words: " + s);
}
}
我能想出的最多可以达到预期的行为(通过考虑用小型大写字母写一次的单词来消除重复,而另一次用大大写字母作为副本来消除重复)是下面的代码,但是我对如何无能为力使用Comparator和SortedSet。我在我的例子中使用了SortedSet,但我可以很好地使用一个简单的Set:
public class FindDups {
public static void main(String[] args) {
Set<String> s = new HashSet<String>();
List<String> list = new ArrayList<String>();
SortedSet<String> eliminatedDups = null;
for (String a : args) {
s.add(a);
list.add(a.toLowerCase());
}
eliminatedDups = new TreeSet<String>(list);
System.out.println(s.size() + " distinct words by taking into consideration the case: " + s);
System.out.println(list.size() + " initial list translated into all small caps: " + list);
System.out.println(eliminatedDups.size() + " distinct words by ignoring case: " + eliminatedDups);
}
}
我如何使用SortedSet和Comparator来获得所需的效果?
谢谢,
受到SJuan76的启发,终于想到了:
public class FindDupsFinal {
public static void main(String[] args) {
SortedSet<String> eliminatedDups2 = new TreeSet<String>(IGNORE_CASE);
for (String a : args) {
eliminatedDups2.add(a);
}
System.out.println(eliminatedDups2.size() + " distinct words by ignoring case: " + eliminatedDups2);
}
static final Comparator<String> IGNORE_CASE = new Comparator<String>() {
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
}
};
}
答案 0 :(得分:16)
SortedSet<String> eliminatedDups =
new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
Collections.addAll(eliminatedDups, args);