Функциональное программирование использования потоков - PullRequest
2 голосов
/ 15 марта 2020

Как я пытался решить с помощью функционального программирования, я застрял, чтобы использовать более эффективно. Запросить, можно ли проверить, что можно сделать в этом случае.

Для заданного массива транзакций, каждая с именем элемента, сгруппируйте все транзакции по имени элемента. Возвращает массив строк, где каждая строка содержит имя элемента, за которым следует пробел, а затем количество транзакций. Отсортируйте массив по убыванию по количеству транзакций, а затем по алфавиту по возрастанию по имени элемента для элементов с соответствующим количеством транзакций.

Пример: list = ["полужирный", "не", "полужирный", "полужирный"]

O / P:

полужирный 3

не 1

пробовал подход до спуска, но запутался в использовании функционального программирования:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class PYT {

    public static void main(String[] args) {            
        List<String> list = new ArrayList<String>();
        list.add("bold");
        list.add("not");
        list.add("bold");
        list.add("bold");
        System.out.println(grT(list));
    }

    private static List<String> grT(List<String> list) {  
        //here this is wrong, as throwing error
         Map<Integer, Long> frequencies = ((CharSequence) list).codePoints()  
                       .parallel()
                       .boxed()
                       .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

        // sort by descending frequency and collect code points into array
        int[] output = frequencies.entrySet()
                               .parallelStream()
                               .sorted(Map.Entry.<Integer, Long>comparingByValue().reversed())
                               .mapToInt(Map.Entry::getKey)
                               .toArray();

        // create output string from List of Strings.  
        // Could not think of a way to return a list of string --> Error
        return new String(output, 0, output.length);
    }
}

Будет полезно, если можно объяснить, как проверить это, используя разложение / функциональную прогу. подход.


Обновление 1: после принятия решительного решения для очистки кода это выглядит намного чище, если не используется функциональным программированием

private static List<String> ascendingOrder(List<String> list) {
    Map<String, Long> stringCount = new HashMap<>();
            for (String t : list) {
                stringCount.merge(t, 1L, Long::sum);
            }

            List<Map.Entry<String, Long>> toSort = new ArrayList<>();
            for (Map.Entry<String, Long> e : stringCount.entrySet()) {
                toSort.add(e);
            }
            toSort.sort(Map.Entry.<String, Long>comparingByValue().reversed().thenComparing(Map.Entry.comparingByKey()));
            List<String> refinedList = new ArrayList<>();
            for (Map.Entry<String, Long> e : toSort) {
                String s = e.getKey() + " " + e.getValue();
                refinedList.add(s);
            }

            return refinedList;
}

1 Ответ

2 голосов
/ 15 марта 2020

Сначала создайте карту, используя имя tx в качестве ключа и его значение в качестве значения. Затем используйте эту карту, чтобы построить структуру, которая вам нужна. Также обратите внимание, что когда вы используете Map.Entry.comparingByValue() вместе с другим оператором в цепочке, таким как reversed или thenComparing, вывод типа не является достаточно мощным, чтобы определить тип для себя, поэтому мы вынуждены помочь ему предоставить их явно , Это сообщенная ошибка, и вы можете найти ее здесь .

private static final String SPACE = " ";

Map<String, Long> frequencyMap = tx.stream()
    .collect(Collectors.groupingBy(t -> t, Collectors.counting()));

List<String> formattedTx = frequencyMap.entrySet().stream()
    .sorted(Map.Entry.<String, Long>comparingByValue().reversed()
        .thenComparing(Map.Entry.comparingByKey()))
    .map(e -> e.getKey() + SPACE + e.getValue())
    .collect(Collectors.toList());
...