【问题标题】:Java Comparator for alternate string sorting用于替代字符串排序的 Java 比较器
【发布时间】:2012-11-25 05:32:03
【问题描述】:

编辑:比较器似乎没有做任何事情。我没有收到任何错误,但(已经按字母顺序排序的)数组没有改变。我应该期待看到 SAD 和 PAD 并排,但我没有。

我有一个字符串数组,我想根据从如何在拨号盘上键入它们得出的数值对它们进行排序。也就是说,“SAD”= 723,“PAD”= 723,“SAP”= 727。我有一个按字母顺序排列的字典,我想将它重新排列成我的顺序,以便对数组进行二进制搜索。对于像 SAD 和 PAD 这样的值相同的东西,它们可以按字母顺序排序。我想尝试使用 Arrays.sort(dictionary, myComparator) 对其进行排序。

首先,这是获得我想要的东西的最佳方式吗?我还能怎么得到这个?

其次,我如何制作自己的比较器?请注意,我只是在编程的第一门课程中,所以我们甚至还没有上课,这只是一堆塞进主课的东西。而且我通常根本不了解课程。因此,如果我必须自己制作课程来完成这项工作,那么我可能不得不自己编写一个快速排序代码。我也没有介绍链表,所以我的数据结构有点笨拙。这是我到目前为止所拥有的,我不知道我在做什么:

将字典放入内存的笨拙方法,重要的行接近底部:

public static String[][] dictToMem()throws FileNotFoundException{
    File myFile = new File("src/words.txt");
    Scanner input = new Scanner(myFile);
    String temp;
    String[] tempDict = new String[7];
    Arrays.fill(tempDict, "");

    while (input.hasNext()){
        temp = input.next();
        if (temp.length() < 8 && temp.indexOf('\'') + temp.indexOf('(') +   temp.indexOf('-') == -3){
            for (int i = 1; i <= 7; i++){
                if (temp.length() == i){
                    tempDict[i-1] += " " + temp;
                }
            }
        }
    }
    for (int i = 0; i<tempDict.length; i++){
        tempDict[i] = tempDict[i].trim();
    }

    String[][] dictionary = new String[7][];
    for (int i = 0; i<tempDict.length; i++){
        dictionary[i] = tempDict[i].split(" ");
    }
    for (int i = 0; i<tempDict.length; i++){
        //  ***This is the line doesn't work, compiler error***
        //  dictionary[i] = Arrays.sort(dictionary[i], String.DialPadNumCompare);
        //  Should be this:
        Arrays.sort(dictionary[i], DialPadNumCompare);
    }
    return dictionary;
}

比较器没有显示错误:

public static Comparator<String> DialPadNumCompare = new Comparator<String>(){
    @Override
    public int compare(String a, String b){
        if (stringToInt(a) == stringToInt(b)){
            return a.compareTo(b);
        }
        return stringToInt(b) - stringToInt(a);
    }
};

String to int 是我的字符串到拨号盘号码的转换方法

【问题讨论】:

  • 好吧,什么编译器错误?
  • 找不到符号符号:变量 DialPadNumCompare 位置:类字符串
  • 尽量遵守java命名约定,变量名以小写开头
  • @Bohemian 我哪里没这么做? “DialPadNumCompare”是变量吗?
  • 带比较器的排序没有做任何事情。程序运行并通过排序,但字典在排序前后看起来是一样的,我应该同时看到 BAN 和 CAN。为什么我被否决了?

标签: java sorting comparator


【解决方案1】:

您的比较器不正确。改成:

public static Comparator<String> dialPadNumCompare = new Comparator<String>(){
    @Override
    public int compare(String a, String b){
        int inta = stringToInt(a);
        int intb = stringToInt(b);
        if (inta == intb)
            return a.compareTo(b);
        return inta - intb;
    }
};

并使用此代码调用此比较器:

Arrays.sort(dictionary, dialPadNumCompare);

这里是Live Demo

【讨论】:

    【解决方案2】:

    对于您的直接错误,请更改行:

    Arrays.sort(dictionary[i], String.DialPadNumCompare);
    

    收件人:

    Arrays.sort(dictionary[i], DialPadNumCompare);
    

    按照您现在的方式,您正在尝试静态引用 String 类的不存在的成员。相反,您应该尝试引用您在自己的类中创建的静态引用 DialPadNumCompare

    【讨论】:

    • 现在我遇到了一个可能与比较器无关的问题。进行您建议的更改会给出:所需的不兼容类型:找到的字符串 []:无效。此外,for 循环的条件应该是 i
    • Arrays 类进行就地排序,并且没有返回类型。将您的线路 dictionary[i] = Arrays.sort(dictionary[i], DialPadNumCompare); 更改为 Arrays.sort(dictionary[i], DialPadNumCompare);
    猜你喜欢
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 2012-08-22
    • 2016-03-31
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多