2014-09-29 104 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