根据自定义排序对单词进行排序

时间:2014-01-18 16:56:31

标签: algorithm sorting

用户设置自己的排序,例如:

String s = "bawfedghijklmnopqrstuvcxyz"

而不是他输入一些词语,如:

"aa", "bb","cc","dd"

现在我必须以排序的形式打印字母。

输出应为:

bb, aa, dd, cc

我没有任何线索如何继续,任何人都可以帮我解决问题吗?代码不是必需的。

4 个答案:

答案 0 :(得分:1)

一个简单的答案:

首先,将它们重新编码为常规排序顺序。例如。在您的情况下,将所有“b”替换为“A”,将“a”替换为“B”,依此类推。

排序。

根据您的映射进行解码。例如。将所有“A”替换为“b”等

答案 1 :(得分:1)

每个字母 x 在字符串 s 中都有一些索引 k [x] ,例如 b 的索引 0
a 的索引 1 w 的索引 2 ,依此类推(假设字符串 s 基于0)。

因此,您需要根据 s
定义的字母索引对单词进行排序 不是基于他们的“正常”/“自然”指数( a 0 b 1
c 2 ,依此类推)。因此,例如,基于 s 定义的排序 有: b < a b 映射到 0 a 映射到 1

所有这一切都要求你这么做。

首先,采用任何排序算法(对于单词),并按字面意思实现 然后排序算法通常有一个点,他们比较两个字符,有 你必须查阅char索引(由 s 定义)并根据它们进行比较 这是您在原始实施中需要做出的唯一改变。

答案 2 :(得分:1)

由C

#include <string.h>
#include <ctype.h>

int strcmp_custom(const char *s1, const char *s2){
    static const char *table="bawfedghijklmnopqrstuvcxyz";
    for ( ; *s1 == *s2; s1++, s2++)
        if (*s1 == '\0')
            return 0;
    if(islower(*s1) && islower(*s2))
        return strchr(table, *s1) < strchr(table, *s2) ? -1 : 1;
    else
        return *(unsigned char *)s1 < *(unsigned char *)s2 ? -1 : 1;
}

int cmp(const void *a, const void *b){
    return strcmp_custom(*(const char **)a, *(const char **)b);
}

答案 3 :(得分:0)

我刚试过以下方法......

    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;

    public class Test {

        static Map<String, Integer> map = new HashMap<String, Integer>();

        public static int compare(String one, String two) {
            int len1 = one.length();
            int len2 = two.length();
            int n = Math.min(len1, len2);
            char v1[] = one.toCharArray();
            char v2[] = two.toCharArray();
            int i = 0;
            int j = 0;

            if (i == j) {
                int k = i;
                int lim = n + i;
                while (k < lim) {
                    char c1 = v1[k];
                    char c2 = v2[k];
                    if (c1 != c2) {
                        return map.get(String.valueOf(c1)) - map.get(String.valueOf(c2));
                    }
                    k++;
                }
            } 

            return len1 - len2;
        }

        public static void main(String[] args) {

            String FORMAT ="bawfedghijklmnopqrstuvcxyz";
            char[] charString = FORMAT.toCharArray();

            for(int i=0; i<charString.length; i++){
                map.put(String.valueOf(charString[i]), i);
            }

            List<String> list = Arrays.asList("bw", "bb", "bd", "ba" ); // Input Strings

            for(int j=0; j<list.size(); j++){
                for(int k=j; k<list.size(); k++){
                    if(compare(list.get(j),list.get(k)) > 0){
                        String temp = list.get(j);
                        list.set(j, list.get(k));
                        list.set(k, temp);
                    }
                }
            }

            System.out.println(list);
        }
    }

注意:如果要在输入字符串中添加大写字母,数字和特殊字符您必须在FORMAT字符串中添加所有字符。我希望我会帮助你进入下一阶段...