Как я пытался решить с помощью функционального программирования, я застрял, чтобы использовать более эффективно. Запросить, можно ли проверить, что можно сделать в этом случае.
Для заданного массива транзакций, каждая с именем элемента, сгруппируйте все транзакции по имени элемента. Возвращает массив строк, где каждая строка содержит имя элемента, за которым следует пробел, а затем количество транзакций. Отсортируйте массив по убыванию по количеству транзакций, а затем по алфавиту по возрастанию по имени элемента для элементов с соответствующим количеством транзакций.
Пример: 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;
}