创建一个忽略大小写的TreeSet

时间:2014-04-02 22:37:39

标签: java collections set comparator sortedset

来自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);
    }
};

}

1 个答案:

答案 0 :(得分:16)

SortedSet<String> eliminatedDups =
   new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
Collections.addAll(eliminatedDups, args);