Подсчет вхождения слова с потоком массивов в Java 8 - PullRequest
0 голосов
/ 04 мая 2018

Как я могу вычислить частоту слов в строке с использованием массива потока? Я использую Java 8.

Вот мой код:

String sentence = "The cat has black fur and black eyes";
String[] bites = sentence.trim().split("\\s+");

String in = "black cat";

вычислите частоту слов "черный" и "кошка" в предложении. Частота слова «черный» равна 2, а слова «кошка» - 1.

Таким образом, конечный результат равен 3.

Ответы [ 8 ]

0 голосов
/ 04 мая 2018
final Collection<String> ins = Arrays.asList(in.split("\\s+"));

Arrays.stream(bites)
    .filter(ins::contains)
    .mapToLong(bite => 1L)
    .sum()
0 голосов
/ 04 мая 2018

Другой простой способ - это использование computeIfAbsent , представленное в java 8

  HashMap<String,LongAdder> wordCount= new LinkedHashMap<>();
    for (String word:sentence.split("\\s")){
      wordCount.computeIfAbsent(word, (k) -> new LongAdder()).increment();
   }

выход

{The=1, cat=1, has=1, black=2, fur=1, and=1, eyes=1}

0 голосов
/ 04 мая 2018

Хотя многие примеры, показывающие, как это было сделано с потоками, великолепны. Вы все еще не должны забывать, что у Collections уже есть метод, который делает это для вас:

List<String> list = Array.asList(bites);
System.out.println(Collections.frequency(list, "black")); // prints 2
System.out.println(Collections.frequency(list, "cat"));   // prints 1
0 голосов
/ 04 мая 2018
    String sentence = "The cat has black fur and black eyes";
    String[] bites = sentence.trim().split("\\s+");
    String in = "black cat";
    long i = Stream.of(bites).filter(e->(Arrays.asList(in.split("\\s")).contains(e))).count();
    System.out.println(i);
0 голосов
/ 04 мая 2018

Если я могу понять ваш вопрос, вы можете использовать это решение для получения ожидаемого результата:

String sentence = "The cat has black fur and black eyes";
String in = "black cat";

List<String> bites  = Arrays.asList(sentence.trim().split("\\s+"));
List<String> listIn = Arrays.asList(in.split("\\s"));

long count = bites.stream().filter(listIn::contains).count();

Выходы

3
0 голосов
/ 04 мая 2018
String sentence = "The cat has black fur and black eyes";
String[] bites = sentence.trim().split("\\s+");

Map<String, Long> counts = Arrays.stream(bites)
       .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
0 голосов
/ 04 мая 2018

Как насчет

Map<String, Long> counts = yourStringStream
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

Это дает вам карту от всех слов до их частоты.

0 голосов
/ 04 мая 2018
Map<String, Long> count = Arrays.stream(bites)
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
...