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

Popular posts from this blog

javascript - RequestAnimationFrame not working when exiting fullscreen switching space on Safari -

Python ctypes access violation with const pointer arguments -