如何使用java 8来保存所有非重复字符

odopli94  于 2023-04-28  发布在  Java
关注(0)|答案(3)|浏览(135)

想要在一个列表中获取每个单词中的非重复字符,并使用java 8将它们连接到一个新单词:
Ex:[ non,repeated,character ]-〉orpatdhte
有什么提示吗?

fgw7neuy

fgw7neuy1#

这是从一个单词中消除重复字母的一种方法:

public String removeDuplicates(String text) {
    Map<String, List<String>> charsVsCount = Arrays.stream(text.split(""))
                .collect(Collectors.groupingBy(c -> c, LinkedHashMap::new, Collectors.toList()));

        return charsVsCount.entrySet().stream()
                .filter(entry -> entry.getValue().size() == 1)
                .map(entry -> entry.getKey())
                .collect(Collectors.joining(""));
}

现在,如果你有一个单词列表,你将对每个单词应用这个逻辑,最后,我们将把它们合并到一起:

var result = words.stream()
        .map(word -> removeDuplicates(word))
        .collect(Collectors.joining(""));

assertEquals("orpatdhte", result);
bz4sfanl

bz4sfanl2#

我终于能够找到一个单一的班轮为上述要求,
需要注意的是,我在groupingBy子句中使用了LinkedHashMap来维护非重复字符的序列

List<String> l = Arrays.asList("non", "repeated", "character");

System.out.println(l.stream().map(word ->   
    { return Arrays.stream(word.split("")).collect(Collectors.groupingBy(Function.identity(),LinkedHashMap::new,Collectors.counting())).entrySet().stream().filter(e-> e.getValue()==1).map(e->e.getKey()).collect(Collectors.joining());
}).collect(Collectors.joining()));
8ehkhllq

8ehkhllq3#

因为这是家庭作业/面试问题,我只提供伪代码:
对于每个单词:

  • 计算每个字母的频率,保持遇到的顺序
  • 丢弃频率大于1的字母
  • 将字母连接到结果

有多种编码方式。
注意:由于需要保留字母顺序,HashMap不会有太大的帮助,但是还有另一种Map实现非常适合。
提示:它可以用一行代码编码(尽管有点长)。

相关问题