但是,由于试图通过函数式编程来解决,我一直坚持要更有效地使用它。询问是否可以检查出在这种情况下可以做什么。
对于给定的交易数组,每个交易都有一个项目名称,将所有交易按项目名称分组。返回一个字符串数组,其中每个字符串都包含项目名称,后跟一个空格,然后是交易数量。对具有匹配交易计数的项目,将数组按交易计数降序排列,然后按项目名称按字母顺序升序排列。
示例:list = [“ bold”,“ not”,“ bold”,“ bold”]
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;
}
问题来源:Stack Overflow
首先使用TX名称作为键创建一个地图,并将其计为值。然后使用此地图构建所需的结构。还要注意,当您将Map.Entry.comparingByValue()with与另一个链接的运算符(如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());
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。