【问题标题】:Overriding Comparator in Java based on Char frequency not ASCII value基于字符频率而不是 ASCII 值在 Java 中覆盖比较器
【发布时间】:2014-07-31 15:13:05
【问题描述】:

我正在尝试根据每个字符 char[] freq 的另一个字符的数组频率对一个字符数组 char[] input 进行排序

一个非常简单的例子是:

input: bey
freq input: bbbyye

output: after sorted would be "bye"

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

现在;如何根据频率对输入进行排序?我实现 Comparator 的尝试失败了。我的代码现在与下面的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
 }
});

我不希望它起作用并且它没有错误是类型数组中的方法 sort(char[]) 不适用于参数 (char[], new Comparator(){})

【问题讨论】:

    标签: java


    【解决方案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);
        }
    
    }
    

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

    【讨论】:

    • 您的意思是将其与发生率而不是 char 进行比较?
    • 在这个例子中我们仍然使用哈希图吗?
    • 不,这不使用哈希图。
    【解决方案2】:

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

    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']
    

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

    【讨论】:

    • 我发现了问题,而不是做Character[]输入我一直在做char输入[]。如果 C# 中存在差异,您现在是否 - 我不记得以前遇到过这种情况。至于“最佳”方法,您认为 tmanion 更好吗?
    • 这真的取决于你使用它的目的,如果它是用于生产代码@tmanion 的解决方案更加封装和可测试。如果你只是在玩,这个可能没问题。我对 C# 中的类型转换了解不多,所以我对此无能为力。
    • 谢谢;对于响应 - 如果问你如何从原始类型 charArray 转换为 java 中的 Character 类型并不过分的话?我来自 C/C# 世界。
    • @xphill64x 不幸的是,在 Java 中没有内置的方法可以做到这一点(据我所知)。您必须手动使用相同大小的 Character 类型的新数组并遍历原始 char 数组,然后将它们添加到 Character 数组中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多