基于Char频率而非ASCII值覆盖Java中的Comparator

时间:2014-06-10 18:11:15

标签: java

我正在尝试根据每个字符char[] input

的另一个字符的数组频率对一个字符数组char[] freq进行排序

一个非常简单的例子是:

input: bey
freq input: bbbyye

output: after sorted would be "bye"

我正在迭代我的freq输入并放置一个键值对,如下面的问题:char c是关键; int是值。

现在;如何根据频率对输入进行排序?我尝试实施比较器的尝试遇到了失败。我的代码现在与以下accepted answer相同。

我想要的"要做的是糟糕的java或伪代码是:

char[] input;
Arrays.sort(input, new Comparator<Character>() {
@Override
public int compare(Character o1, Character o2) {
  return counts.get(o2) - counts.get(o1); //counts is a static
  //global hashmap with the frequency values
 }
});

我不希望它工作,它不会错误是Arrays类型中的方法sort(char [])不适用于参数(char [],new Comparator(){})

2 个答案:

答案 0 :(得分:4)

我很困惑,看来您的初始方法确实有效。这是一个小例子:

import java.util.*;

public class TestArrayComparator {
   public static Map<Character, Integer> freq = new HashMap<>();
   static {
      freq.put('b',3);
      freq.put('y',2);
      freq.put('e',1);
   }
   public static void main(String[] args) {
      Character[] input = new Character[]{'b','e','y'};

      Arrays.sort(input, new Comparator<Character>() {
         @Override
         public int compare(Character o1, Character o2) {
            return freq.get(o2) - freq.get(o1);
         }
      });
      System.out.println(Arrays.toString(input));
   }
}
//outputs ['b','y','e']

我并不是说这是最佳方法,但确实有效。

答案 1 :(得分:1)

我认为在这种情况下你应该做的是为FrequencyCharacter创建一个新类

public class FrequencyCharacter implements Comparable<FrequencyCharacter> {
    private int occurrences;
    private char c;

    public FrequencyCharacter(int occurrences, char c) {
        this.occurrences = occurrences;
        this.c = c;
    }

    @Override
    public int compareTo(FrequencyCharacter o) {
        return Integer.compare(occurrences, o.occurrences);
    }

}

创建这些对象然后对它们进行排序。您可以轻松打印结果。