当前位置: 首页 > 知识库问答 >
问题:

我需要根据另一个整数数组对字符数组进行排序。下面是我的代码

周和安
2023-03-14

如何根据freq数组对ele数组进行排序

public class Comparator1 {

    public static void main(String[] args) {
        char[] ele = { 'a', 'b', 'c', 'd', 'e' };
        int[] freq = { 5, 4, 3, 2, 1 };
        
        System.out.println(Arrays.toString(ele));
    }

}

共有3个答案

史同化
2023-03-14

你肯定需要更具体一些。从char转换时,是否要基于int数组对应的有序整数对char数组进行排序?例如,['a','d','b','c','e']和[3,1,2,5,4]变成['c','a','b','e','d']?或者int数组中的整数应该表示char数组的索引吗?例如,给定上一个实例的相同数组,我们现在的输出是['d','b','a','e','c']。这个问题需要更多的背景。

无论如何,我已经制定了两个简单而优雅的解决方案来解决这两种情况。它们很简单,因为它们避免了任何复杂的数据结构,如HashMaps或TreeMaps,只使用数组。享受:)

案例1

char ele[] = new char[] { 'a', 'd', 'b', 'c', 'e' };
int freq[] = new int[] { 3, 1, 2, 5, 4 };
Arrays.sort(ele);
char sortedEle[] = new char[ele.length];
int idxCounter = 0;
for (int i = 0; i < freq.length; i++) {
   for (int j = 0; j < ele.length; j++) {
       if (freq[i] == j + 1) {
           sortedEle[idxCounter] = ele[j];
           idxCounter++;
       }
    }
}
System.out.println(Arrays.toString(sortedEle));

案例2

char ele[] = new char[] { 'a', 'd', 'b', 'c', 'e' };
int freq[] = new int[] { 3, 1, 2, 5, 4 };
char sortedEle[] = new char[ele.length];
for (int i = 0; i < ele.length; i++) {
    int idx = freq[i] - 1;
    sortedEle[idx] = ele[i];
}
System.out.println(Arrays.toString(sortedEle));
朱乐逸
2023-03-14

将它转换成地图可以更好地帮助你,因为你可以轻松地排序地图。试试下面的代码

    char ele[] = new char[] { 'a', 'b', 'c', 'd', 'e' };
    int freq[] = new int[] { 5, 4, 7, 2, 1 };
    int n=ele.length;
    //this will check whether both have same element or not 
    if(n!=freq.length)
        return;

    Map<Character,Integer> unsorted=new HashMap<>();
    //this will merge your both array into single map with key as char and freq as value
    for(int i=0;i<n;i++)
    {

        unsorted.put(ele[i],freq[i]);
    }
    
    Map<Character, Integer> sorted = new LinkedHashMap<>();
    unsorted.entrySet().stream()
            .sorted(Map.Entry.<Character, Integer>comparingByValue().reversed())
            .forEachOrdered(x -> sorted.put(x.getKey(), x.getValue()));
    sorted.forEach((k,v)->
    {

        System.out.println(k+" --> "+v);
    });
郁烨
2023-03-14

如果freq数组中没有重复,可以使用TreeMap

public static char[] sort(char[] ele, int[] freq) {
    Map<Integer, Character> map = new TreeMap<>();

    for (int i = 0; i < ele.length; i++)
        map.put(freq[i], ele[i]);

    int i = 0;

    for (Character ch : map.values())
        ele[i++] = ch;

    return ele;
}

否则,您可以使用PriorityQueue

public static char[] sort(char[] ele, int[] freq) {
    class Pair {

        final char ele;
        final int freq;

        public Pair(char ele, int freq) {
            this.ele = ele;
            this.freq = freq;
        }

    }

    Queue<Pair> queue = new PriorityQueue<>(Comparator.comparingInt(pair -> pair.freq));

    for (int i = 0; i < ele.length; i++)
        queue.add(new Pair(ele[i], freq[i]));

    int i = 0;

    for (Pair pair : queue)
        ele[i++] = pair.ele;

    return ele;
}
 类似资料:
  • 问题内容: 是否可以对看起来像这样的数组进行排序和重新排列: 匹配此数组的安排: 不幸的是,我没有任何要跟踪的ID。我将需要优先处理items-array,以使其尽可能接近sortingArr。 更新: 这是我正在寻找的输出: 任何想法如何做到这一点? 问题答案: 就像是: 这是一个较短的代码,但是会破坏数组:

  • 我有两个整数数组,我试图根据另一个数组对第一个数组进行排序。 例如。和 b = {1,2,2,0,0, 在 B 中排序的值是 A 中每个整数的实值 排序后我期望的预期结果是: 这是我用的代码 它给出了我的输出:<code>a={2,3,1,0,0,6}和

  • 问题内容: 我有多个数组,我想根据其中一个的排序顺序对所有数组进行排序,如下所示: 我希望函数执行后,数组将如下所示: 问题答案: 您可以执行以下操作:首先根据键控数组的索引的索引对它们进行索引的值对它们进行排序,然后使用: 如果要在任何类型的集合上使它通用(但仍以与std lib集合算法相同的样式返回数组): 以及带有自定义比较器的版本:

  • 我有多个数组,我想根据其中一个数组的排序顺序对所有数组进行排序,如下所示: 我预计函数执行后的数组将如下所示:

  • 我有学生(弦)和老师(弦列表)。我想根据讲师人数按降序提取记录。讲师如下示例:[a、b、c]-3、[e、f]-2、[g、h、i、j]-4。 我要按4,3,2的顺序。 这取决于现场讲师阵列的大小。如何使用mongoTemplate或自定义mongodb查询或聚合进行查询??