c# 4.0 - Java Streams v .Net (C#) LINQ -


i need know if string or char array has duplicate characters , if how many of each duplicates there are.

with linq can following way:-

class program {     private const string source = "appearances";      static void main(string[] args) {         var testq =             ch in source             group ch ch testg             testg.count<char>() > 1             select testg;          int num;         foreach (var tg in testq) {             num = tg.count();             console.out.writeline("{0}, {1}", tg.elementat(0), num);         }          console.readline();     } } 

can suggest how might go java streams?

you stream - suppose mean java 8.

here how it:

public map<character, integer> countoccurs(final char[] input) {     return countoccurs(new string(input)); }  public map<character, integer> countoccurs(final string input) {     return input.chars().             collect(                     hashmap::new,                     (m, c) -> m.merge((char) c, 1, integer::sum),                     hashmap::putall             ); } 

the idea take intstream of char values in string int. collect() intstream map; foldleft operation functional language. map.merge method takes key , value , lambda merges existing value , new value if 1 in map - pass integer::sum add 2 values together.

the gymnastics int , char , character legacy java issue. there no primitive charstream in new java 8 api have use intstream - have cast int char , autoboxed character.

example usage:

system.out.println(countoccurs("abbccddde")); 

output:

{a=1, b=2, c=2, d=3, e=1} 

if want filter counts can do:

final map<character, integer> count = countoccurs("abbccddde"); count.entryset().stream().     filter(e -> e.getvalue() > 1).     foreach(system.out::println); 

which give you:

b=2 c=2 d=3 

if want similar in logic linq example, would work:

public collection<? extends map.entry<character, integer>> countoccurs(final string input) {     return input.chars().boxed().             collect(groupingby(identity())).entryset().stream().             filter(e -> e.getvalue().size() > 1).             map(e -> new abstractmap.simpleentry<>((char)(int)e.getkey(), e.getvalue().size())).             collect(tolist()); } 

but it's quite ugly , requires intermediate collection.

p.s. excuse formatting, i'm not yet sure how format long lines of stream manipulation. i'm sure there'll style guidelines established soon.


Comments