Java自定义排序字符

Java自定义排序字符,java,string,sorting,Java,String,Sorting,我有一个字符串,比如crccoaaroac。如何使用自定义排序进行写入,以便字符串中的字母按以下顺序排列: 1) c 2) r 3) o 4) a 因此,排序后的字符串将是cccrrooaaa 我对Java比较陌生。我知道如何进行升序和降序排序,但定制排序的好方法是什么?正如@Stef所说,您可以通过计算每个字符出现的频率,然后重新编写它们,无论它们以您想要的特定顺序出现的频率 import java.util.*; public final class StackOverflow {

我有一个字符串,比如
crccoaaroac
。如何使用自定义排序进行写入,以便字符串中的字母按以下顺序排列:

1) c
2) r
3) o
4) a
因此,排序后的字符串将是
cccrrooaaa

我对Java比较陌生。我知道如何进行升序和降序排序,但定制排序的好方法是什么?

正如@Stef所说,您可以通过计算每个字符出现的频率,然后重新编写它们,无论它们以您想要的特定顺序出现的频率

import java.util.*;

public final class StackOverflow {

    private static String reorder(String s, char[] ordering) {
        Map<Character, Integer> charCount = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            char currentChar = s.charAt(i);
            int currentCount = charCount.getOrDefault(currentChar, 0);
            charCount.put(currentChar, currentCount + 1);
        }

        StringBuilder builder = new StringBuilder();
        for (char ch : ordering) {
            int count = charCount.getOrDefault(ch, 0);
            builder.append(String.valueOf(ch).repeat(count));
        }
        return builder.toString();
    }

    public static void main(String[] args) {
        String reordered = reorder("crccoaaroac", new char[]{'c', 'r', 'o', 'a'});
        System.out.println(reordered);
    }
}

下面是您如何做到这一点的,包括评论:

        //your input
        String str= "crccoaaroac";
        // your character rank
        Map<Character, Integer> rank = new HashMap<>();
        rank.put('c', 1);rank.put('r', 2);rank.put('o', 3);rank.put('a', 4);
        // final result builder 
        StringBuilder sb = new StringBuilder();
        
        //actual sorting using your custom comparator
        str.chars().boxed().map(e->(char)e.intValue() ).
        sorted((a,b)-> rank.get(a)- rank.get(b)).forEach(e-> sb.append(e));
        
        //final result
        String result = sb.toString();
        System.out.println(result);
//您的输入
String str=“crccoaaroac”;
//你的品级
Map rank=newhashmap();
秩.put('c',1);秩.put('r',2);秩.put('o',3);秩.put('a',4);
//最终结果生成器
StringBuilder sb=新的StringBuilder();
//使用自定义比较器进行实际排序
str.chars().boxed().map(e->(char)e.intValue())。
排序((a,b)->rank.get(a)-rank.get(b)).forEach(e->sb.append(e));
//最终结果
字符串结果=sb.toString();
系统输出打印项次(结果);
您可以使用定义自定义排序顺序

根据规范(枚举比较):

Enum通过Enum的自然顺序(值的声明顺序)实现Compariable


编辑:格式化使用流收集到
LinkedHashMap
的示例,以保持将字符插入映射的顺序(即,对于字符串
CCOCCroca
,结果将按
CCCCCCOOORA
排序):

String s=“crccoaaroac”;
字符串str=s.chars()
.mapToObj(i->(char)i)
.collect(收集器.groupingBy(
x->String.valueOf(x),LinkedHashMap::new,Collectors.counting())
.entrySet()
.stream()
.peek(System.out::println)//调试打印
.map(e->e.getKey()。重复(e.getValue().intValue())
.collect(收集器。连接(“”);
系统输出打印项次(str);
输出

c=4
r=2
o=2
a=3
ccccrrooaaa

将字符串拆分为字符数组。可以使用自定义订单手动进行排序,也可以使用比较器。顺便问一下:如果字符串中有第五个字符(可能是“x”),会发生什么?@NomadMaker我想将其拆分为LinkedHashMap,但不确定如何按键自定义排序。只有这4个字符,我只需要使用一个集合或者一个HashMap(字符来保存字符,整数来保存字符的数量)。你点的菜很特别。您可以使用数组
char[]order={c',r',o',a'}
或者只对其进行硬编码。@NomadMaker您可以编写一个类似这样的示例:
Map mp=new LinkedHashMap();mp.entrySet().stream().sorted())
我想在Java8中应该是这样的?我只需要使用一个循环。我退休时从未使用过j8流。
import java.util.stream.Collectors;

class CustomSort {
    enum CustomSortOrder {
        c,
        r,
        o,
        a,
    }

    public static void main(String[] args) {
        String unsorted = "cccaaaoorr";
        String sorted = unsorted.chars().mapToObj(i -> (char) i)
            .map(x -> CustomSortOrder.valueOf(String.valueOf(x)))
            .sorted()
            .map(String::valueOf)
            .collect(Collectors.joining());
        System.out.println(sorted);
    }
}
c=4
r=2
o=2
a=3
ccccrrooaaa