2014-09-29 106 views
3

今天,我有一个不区分大小写的排序Set,如:不区分大小写的有序集合 - 保持相同的字符串大小写不同的

Set<String> set = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); 
set.add("foo"); 
set.add("FOO"); 
set.add("bar"); 
System.out.println(set.toString()); 

的这个输出是:

[bar, foo] 

但我真正想要的是:

[bar, FOO, foo] 

也就是说,我要排序S的并且不区分大小写,但我希望能够在集合中使用不同情况下的相同字符串(如“foo”和“FOO”),而不丢弃最后一个字符串。

我知道我可以排序List,但在我的情况下,我需要一个Set

在Java中这样做有一个简洁的方法吗?

+0

我不认为你保证之前与''String.CASE_INSENSITIVE_ORDER',如果这是你期待什么foo'得到'FOO'。这是一种不敏感的排序,因此,“FOO”和“foo”是相同的,因此可以以任何顺序出现。 – 2014-09-29 14:03:18

+0

@ T.J.Crowder“FOO”和“foo”的顺序并不重要,棘手的部分是将它们都放在集合中,同时在'FOO'之前的'bar'。 – holmis83 2014-09-29 14:12:30

回答

6

您可能希望使用一个不区分大小写的比较器,然后使用区分大小写的排序作为tiebreaker。

因此,像:

Set<String> set = new TreeSet<>((a, b) -> { 
    int insensitive = String.CASE_INSENSITIVE_ORDER.compare(a, b); 
    return insensitive==0 ? a.compareTo(b) : insensitive; 
}); 
+1

*男*我爱lambda。 – 2014-09-29 14:03:59