2015-06-05 15 views
5

Böyle bir şey yaptık:bir List <String> gelen küçük harfler sayısı en yüksek olan Dize bulun. (Kullanma akışları)

List<String> strList = asList("getElementById", "htmlSpecialChars", "httpRequest"); 
String maxOfLowercase = strList.stream() 
      .max((o1, o2) -> { 
       long lowerCount1 = o1.chars().filter(Character::isLowerCase).count(); 
       long lowerCount2 = o2.chars().filter(Character::isLowerCase).count(); 
       return Long.compare(lowerCount1, lowerCount2); 
      }).get(); 

Ama buna, bu daha kolay \ Shoter yapmak mümkün değil mi düşünüyorsunuz? Daha kolay

cevap

5

normal ifadeler kullanabilirsiniz tüm küçük harf karakterleri desteklemek istiyorsanız:

String maxOfLowercase = strList.stream() 
     .max(Comparator.comparingLong(o -> o.chars().filter(Character::isLowerCase).count())) 
     .get(); 
0

/kısa tatmaya ama bu şekilde yazabilir.

import static java.util.stream.Collectors.*; 

List<String> maxOfLowercase = strList.stream() 
         .collect(groupingBy(s -> s.replaceAll("[^a-z]", "").length(), 
                  TreeMap::new, toList())) 
         .lastEntry().getValue(); 

Bir avantaj, aynı sayıda küçük harfli karakterleri varsa, birden fazla sözcük vermesidir. Bu, her bir kelimeyi, karşılaştırma başına bir kez değil, yalnızca bir kez filtreleyecektir.

size kod kısaltmak için yardımcı olabilir Comparator arayüzünde uygun statik yöntem vardır

"[^\\p{javaLowerCase}]"