为了账号安全,请及时绑定邮箱和手机立即绑定

根据出现次数排列字符串的字符,如果元素不重复,则保持插入顺序

根据出现次数排列字符串的字符,如果元素不重复,则保持插入顺序

LEATH 2022-07-14 16:37:34
输入你好世界输出低头我找到了一些计算出现次数的方法的答案,但这些方法弄乱了插入顺序,为了得到上述输出而需要维护。我正在寻找如何解决它的方法。我不擅长 Java 8 流和地图!!!虽然会尝试理解。
查看完整描述

2 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

Map适合根据出现次数获取字符的情况。Map只是将数据存储在键值对中的结构。有关详细信息,请参见此处。


因此,要获取字符及其在没有 java8 的情况下出现的次数,您可以这样做:


public Map<Character, Long> countChar(String string) {


    Map<Character, Long> result = new LinkedHashMap<>();

    char[] chars = string.toCharArray();


    for (char c : chars) {

        if (result.get(c) != null) {

            result.put(c, result.get(c) + 1);

        } else {

            result.put(c, 1L);

        }

    }

    return result;

}

接下来,您要按出现次数对值进行排序。在这种情况下,您可以按值对结果映射进行排序。请参阅Sort a Map<Key, Value> by values以找到您更熟悉的解决方案。要在没有流的情况下执行此操作,但使用 java8:


List<Map.Entry<Character, Long>> list = new ArrayList<>(result.entrySet());

list.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));

现在您可以像这样打印每个字符:


StringBuilder output = new StringBuilder();


for (Map.Entry<Character, Long> entry : list) {

    output.append(entry.getKey());

}


System.out.println(output);



查看完整回答
反对 回复 2022-07-14
?
青春有我

TA贡献1784条经验 获得超8个赞

一种可能的解决方案可能是以下方法:


private static String rearrange(String text) {

    return Arrays.stream(text.split("")) // create a stream with all letters

            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) // create a map counting the occurrences of each letter

            .entrySet().stream() // create a stream of the map

            .sorted(Map.Entry.<String, Long>comparingByValue().reversed() // sort the letters by frequency, reversed for most frequent first

                    .thenComparingInt(e -> text.indexOf(e.getKey()))) // sort by position in original text if letter frequency is equal

            .map(Map.Entry::getKey) // map back to stream with all letters

            .collect(Collectors.joining()); // join all letters

}

它返回重新排列的字符串:


String text = "HelloWorld";

String rearranged = rearrange(text);

System.out.println(rearranged);

哪个打印:


loHeWrd


查看完整回答
反对 回复 2022-07-14
  • 2 回答
  • 0 关注
  • 77 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信