【问题标题】:Sort String list in pre-defined custom ordering以预定义的自定义排序对字符串列表进行排序
【发布时间】:2014-08-27 20:03:35
【问题描述】:

我有一个项目,其中程序询问用户它应该运行多少次。在每次运行期间,都会创建一个列表并添加元素。数组中的这些元素不是按字母顺序排序的,而是按以下顺序排序的:

q,w,e,r,t,y,u,i,o,p,l,k,j,h,g,f,d,s,a,z,x,c,v,b,n,m

我能够运行我的程序直到它接受输入,但我不知道下一步该做什么......

示例输入

2

3
what
are
you

2
sad
set

样本输出

what
you
are

set
sad

这是我的代码:

import java.util.*;


public class WeirdWritings {

    public static void main(String[] args) {
        int data,word,ctr,i,ii;
        char[] rLetter = {'Q','W','E','R','T','Y','U','I','O','P','L','K','J','H','G','F','D','S','A','Z','X','C','V','B','N','M'};
        String entry;

        Scanner s = new Scanner(System.in);

        data=s.nextInt();
        for (ctr=0;ctr<rLetter.length;ctr++)
            System.out.print(rLetter[ctr]);
        System.out.println();

        for (ii = 0; ii<data; ii++) {
            word=s.nextInt();
            List<String> array_ii = new ArrayList<String>();
            for(i=0; i<word; i++) {
                entry=s.next();
                array_ii.add(entry);
            }
        }

    }
}

将比较器添加到它以完成它

公共类 MyComparator 实现 Comparator {

private int[] charRank;

public MyComparator() {
    char[] charOrder = {'Q','W','E','R','T','Y','U','I','O','P','L','K','J','H','G','F','D','S','A','Z','X','C','V','B','N','M'};
    this.charRank = new int[26];
    for(int i=0; i<25; i++) {
        this.charRank[charToInt(charOrder[i])] = i; 
    }
}

public int compare(String s1, String s2) {
    // returns
    // Positive integer if s1 greater than s2
    // 0 if s1 = s2
    // Negative integer if s1 smaller than s2
    s1 = s1.toUpperCase();
    s2 = s2.toUpperCase();
    int l = Math.min(s1.length(), s2.length());
    int charComp;
    for(int i=0; i<l; i++) {
        charComp = this.charRank[charToInt(s1.charAt(i))] - charRank[charToInt(s2.charAt(i))];
        if(charComp != 0)
            return charComp;
    }
    return s1.length() - s2.length();
}

//works for c between 'A' and 'Z' - upper case letters
private static int charToInt(char c) {
    return c - 65;
}

//works for 0<=i<=25
private static char intToChar(int i) {
    return (char) (i + 65);
}

public static void main(String[] args) {
    int data,word,ctr,i,ii;
    char[] rLetter = {'Q','W','E','R','T','Y','U','I','O','P','L','K','J','H','G','F','D','S','A','Z','X','C','V','B','N','M'};
    String entry;

    Scanner s = new Scanner(System.in);

    data=s.nextInt();
    for (ctr=0;ctr<rLetter.length;ctr++)
        System.out.print(rLetter[ctr]);
    System.out.println();

    for (ii = 0; ii<data; ii++) {
        word=s.nextInt();
        String[] array_ii = new String[word];
        for(i=0; i<word; i++) {
            entry=s.next();
            array_ii[i]=(entry);
        }
        Arrays.sort(array_ii, new MyComparator());
        for(i=0; i<word; i++) {
            System.out.println(array_ii[i]);
        }
    }



}

}

【问题讨论】:

  • 我没有看到对您的代码进行排序的任何尝试;我怀疑你应该写一个遵循你发布的“qwerty”排序规则的Comparator

标签: java sorting comparator


【解决方案1】:

您可以构建自己的比较器:

import java.util.Comparator;

public class MyComparator implements Comparator<String> {

    private int[] charRank;

    public MyComparator() {
        char[] charOrder = {'Q','W','E','R','T','Y','U','I','O','P','L','K','J','H','G','F','D','S','A','Z','X','C','V','B','N','M'};
        this.charRank = new int[26];
        for(int i=0; i<25; i++) {
            this.charRank[charToInt(charOrder[i])] = i; 
        }
    }

    public int compare(String s1, String s2) {
        // returns
        // Positive integer if s1 greater than s2
        // 0 if s1 = s2
        // Negative integer if s1 smaller than s2
        s1 = s1.toUpperCase();
        s2 = s2.toUpperCase();
        int l = Math.min(s1.length(), s2.length());
        int charComp;
        for(int i=0; i<l; i++) {
            charComp = this.charRank[charToInt(s1.charAt(i))] - charRank[charToInt(s2.charAt(i))];
            if(charComp != 0)
                return charComp;
        }
        return s1.length() - s2.length();
    }

    //works for c between 'A' and 'Z' - upper case letters
    private static int charToInt(char c) {
        return c - 65;
    }

    //works for 0<=i<=25
    private static char intToChar(int i) {
        return (char) (i + 65);
    }

}

然后,你只需要运行:

Arrays.sort(entryArray, new MyComparator());

现在做一些解释。

MyComparator 的构造函数为您的每个字母构建一个等级数组。在实践中,它将以{18, 23, 21, ... } 开头,因为“A”在第 18 位,“B”在第 23 位......

然后,当您比较两个字符串s1s2 时,将按字典顺序一个一个地比较字符。

  • 假设第一个n 字符是相同的,现在,您比较c1c2。如果c1 的排名低于c2 的排名,那么您必须返回一个负整数,因为s1 按字典顺序排在s2 之前(s1 小于s2)。如果c1 的排名大于c2 的排名,则相反。如果两个等级相等,c1c2 相等,则必须查看下一个字符。
  • 如果您到达一个字符串的末尾,那么两个字符串中的任何一个相等,或者一个字符串是另一个字符串的前缀。在每种情况下,比较字符串的长度就足够了:如果s1 更短,则按字典顺序排在第一位,如果更小,则必须返回一个负整数。

给你。我希望这是你在等待的。

@Edit:s1 = s1.toUpperCase() 只是为了避免区分大小写字母的痛苦。如果您更喜欢使用小写字母,只需将其更改为s1 = s1.toLowerCase(),将方法intToChar 更改为return c-97(小写'a' 的ASCII 码),然后自然而然地指定charOrder 数组在使用小写字母的构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2014-02-08
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多