Sorting 分类“;“数字”;按数字顺序

Sorting 分类“;“数字”;按数字顺序,sorting,Sorting,我正在寻找一种将“数字单词”按数字顺序排序的方法。例如,假设我有一个列表[“五”、“三”、“六”、“八”],我想将它按[“三”、“五”、“六”、“八”]排序,而不是按字典顺序排序。我环顾了四周,包括这个网站,最接近/最好的解决方案是使用地图并根据键值对对列表进行排序 我还提出了其他类似的想法,但最终所有这些想法都需要构建一个大表/列表,以将数字单词与实际数字相匹配。我希望有一个解决方案,如果可能的话,它可以自动扩展–因此,如果它适用于上面的列表,它也适用于列表[“壹亿肆仟玖亿伍仟零贰”、“六”、

我正在寻找一种将“数字单词”按数字顺序排序的方法。例如,假设我有一个列表[“五”、“三”、“六”、“八”],我想将它按[“三”、“五”、“六”、“八”]排序,而不是按字典顺序排序。我环顾了四周,包括这个网站,最接近/最好的解决方案是使用地图并根据键值对对列表进行排序


我还提出了其他类似的想法,但最终所有这些想法都需要构建一个大表/列表,以将数字单词与实际数字相匹配。我希望有一个解决方案,如果可能的话,它可以自动扩展–因此,如果它适用于上面的列表,它也适用于列表[“壹亿肆仟玖亿伍仟零贰”、“六”、“四”]。我想得越多,就越不确定能不能完成。非常感谢您的帮助。

您可以使用以下函数转换数字,然后使用任何标准排序算法对数字进行排序

public static int convertNum(String input)
{       
    ArrayList<String> prefixTable = new ArrayList<String>();
    prefixTable.add("ZE");
    prefixTable.add("ON");
    prefixTable.add("TW");
    prefixTable.add("TH");
    prefixTable.add("FO");
    prefixTable.add("FI");
    prefixTable.add("SI");
    prefixTable.add("SE");
    prefixTable.add("EI");
    prefixTable.add("NI");
    prefixTable.add("TEN");
    prefixTable.add("ELEVEN");
    prefixTable.add("TWELVE"); //MUST BE AT END OTHERWISE TW REGISTERS AS PREFIX

    Map<String, Integer> delimTable = new HashMap<String, Integer>();
    delimTable.put("HUNDRED", 100);
    delimTable.put("THOUSAND", 1000);
    delimTable.put("MILLION", 1000000);
    delimTable.put("BILLION", 1000000000);

    String[] theWords = input.toUpperCase().split(" ");  
    int runningTotal = 0;
    int currentRunningNum = 0;
    int currentNum = 1;
    boolean skipTransfer = false;

    for(int i = 0; i < theWords.length; i++)
    {
        if(theWords[i].equals("AND") || theWords[i].equals("NEGATIVE"))
            continue;

        if(delimTable.containsKey(theWords[i]))
        {
            if(delimTable.get(theWords[i]) == 100)
                skipTransfer = true;
            else
                skipTransfer = false;
            currentRunningNum *= delimTable.get(theWords[i]);
            continue;
        }

        if(!skipTransfer)
        {
            runningTotal += currentRunningNum;
            currentRunningNum = 0;
        }
        skipTransfer = false;

        currentNum = 1;

        for(int j = prefixTable.size() - 1; j >= 0 && currentNum == 1; j--)
            if(theWords[i].startsWith(prefixTable.get(j)))
                currentNum *= j;

        if(theWords[i].endsWith("EEN"))
            currentNum += 10;
        if(theWords[i].endsWith("TY"))
        {
            currentNum *= 10;
            skipTransfer = true;
        }

        currentRunningNum += currentNum; //ADD TOTAL
    }
    runningTotal += currentRunningNum;
    if(theWords[0].equals("NEGATIVE"))
        runningTotal *= -1;

    return runningTotal;
}
publicstaticintconvertnum(字符串输入)
{       
ArrayList prefixTable=新的ArrayList();
前缀。添加(“ZE”);
可前置。添加(“ON”);
可前置。添加(“TW”);
可前置。添加(“TH”);
前缀。添加(“FO”);
可前置。添加(“FI”);
前缀。添加(“SI”);
前缀。添加(“SE”);
可前置。添加(“EI”);
可前置。添加(“NI”);
前缀。添加(“十”);
前缀。添加(“十一”);
prefixTable.add(“十二”);//必须在末尾,否则TW将注册为前缀
Map delimTable=new HashMap();
可拆卸。放置(“百”,100);
可拆卸。放置(“千”,1000);
可交割。卖出(“百万”,1000000);
可转让。卖出价(“十亿”,100000000);
字符串[]theWords=input.toUpperCase().split(“”);
int runningTotal=0;
int currentRunningNum=0;
int currentNum=1;
布尔skipTransfer=false;
for(int i=0;i=0&¤tNum==1;j--)
if(单词[i].startsWith(prefixTable.get(j)))
currentNum*=j;
如果(单词[i].endsWith(“EEN”))
currentNum+=10;
如果(单词[i].endsWith(“TY”))
{
currentNum*=10;
skipTransfer=真;
}
currentRunningNum+=currentNum;//添加总计
}
runningTotal+=当前RunningNum;
如果(单词[0]。等于(“负”))
runningTotal*=-1;
返回运行总数;
}
或许可以尝试以下答案:。当我试图解决这个确切的问题时,它对我很有效。正如@abagshaw所提到的,在word格式的数字转换为数字格式后,使用任何排序算法对数组进行排序都是有效的

@Kartic的代码如下:

boolean isValidInput = true;
long result = 0;
long finalResult = 0;
List<String> allowedStrings = Arrays.asList
(
        "zero","one","two","three","four","five","six","seven",
        "eight","nine","ten","eleven","twelve","thirteen","fourteen",
        "fifteen","sixteen","seventeen","eighteen","nineteen","twenty",
        "thirty","forty","fifty","sixty","seventy","eighty","ninety",
        "hundred","thousand","million","billion","trillion"
        );

String input="One hundred two thousand and thirty four";

if(input != null && input.length()> 0)
{
    input = input.replaceAll("-", " ");
    input = input.toLowerCase().replaceAll(" and", " ");
    String[] splittedParts = input.trim().split("\\s+");

    for(String str : splittedParts)
    {
        if(!allowedStrings.contains(str))
        {
            isValidInput = false;
            System.out.println("Invalid word found : "+str);
            break;
        }
    }
    if(isValidInput)
    {
        for(String str : splittedParts)
        {
            if(str.equalsIgnoreCase("zero")) {
                result += 0;
            }
            else if(str.equalsIgnoreCase("one")) {
                result += 1;
            }
            else if(str.equalsIgnoreCase("two")) {
                result += 2;
            }
            else if(str.equalsIgnoreCase("three")) {
                result += 3;
            }
            else if(str.equalsIgnoreCase("four")) {
                result += 4;
            }
            else if(str.equalsIgnoreCase("five")) {
                result += 5;
            }
            else if(str.equalsIgnoreCase("six")) {
                result += 6;
            }
            else if(str.equalsIgnoreCase("seven")) {
                result += 7;
            }
            else if(str.equalsIgnoreCase("eight")) {
                result += 8;
            }
            else if(str.equalsIgnoreCase("nine")) {
                result += 9;
            }
            else if(str.equalsIgnoreCase("ten")) {
                result += 10;
            }
            else if(str.equalsIgnoreCase("eleven")) {
                result += 11;
            }
            else if(str.equalsIgnoreCase("twelve")) {
                result += 12;
            }
            else if(str.equalsIgnoreCase("thirteen")) {
                result += 13;
            }
            else if(str.equalsIgnoreCase("fourteen")) {
                result += 14;
            }
            else if(str.equalsIgnoreCase("fifteen")) {
                result += 15;
            }
            else if(str.equalsIgnoreCase("sixteen")) {
                result += 16;
            }
            else if(str.equalsIgnoreCase("seventeen")) {
                result += 17;
            }
            else if(str.equalsIgnoreCase("eighteen")) {
                result += 18;
            }
            else if(str.equalsIgnoreCase("nineteen")) {
                result += 19;
            }
            else if(str.equalsIgnoreCase("twenty")) {
                result += 20;
            }
            else if(str.equalsIgnoreCase("thirty")) {
                result += 30;
            }
            else if(str.equalsIgnoreCase("forty")) {
                result += 40;
            }
            else if(str.equalsIgnoreCase("fifty")) {
                result += 50;
            }
            else if(str.equalsIgnoreCase("sixty")) {
                result += 60;
            }
            else if(str.equalsIgnoreCase("seventy")) {
                result += 70;
            }
            else if(str.equalsIgnoreCase("eighty")) {
                result += 80;
            }
            else if(str.equalsIgnoreCase("ninety")) {
                result += 90;
            }
            else if(str.equalsIgnoreCase("hundred")) {
                result *= 100;
            }
            else if(str.equalsIgnoreCase("thousand")) {
                result *= 1000;
                finalResult += result;
                result=0;
            }
            else if(str.equalsIgnoreCase("million")) {
                result *= 1000000;
                finalResult += result;
                result=0;
            }
            else if(str.equalsIgnoreCase("billion")) {
                result *= 1000000000;
                finalResult += result;
                result=0;
            }
            else if(str.equalsIgnoreCase("trillion")) {
                result *= 1000000000000L;
                finalResult += result;
                result=0;
            }
        }

        finalResult += result;
        result=0;
        System.out.println(finalResult);
    }
}
布尔值isValidInput=true;
长结果=0;
长期最终结果=0;
List allowedStrings=Arrays.asList
(
“零”、“一”、“二”、“三”、“四”、“五”、“六”、“七”,
“八”、“九”、“十”、“十一”、“十二”、“十三”、“十四”,
“十五”、“十六”、“十七”、“十八”、“十九”、“二十”,
“三十”、“四十”、“五十”、“六十”、“七十”、“八十”、“九十”,
“百”、“千”、“百万”、“十亿”、“万亿”
);
字符串输入=“壹佰贰仟叁佰肆”;
if(input!=null&&input.length()>0)
{
input=input.replaceAll(“-”,”);
input=input.toLowerCase().replaceAll(“and“,”);
String[]splittedParts=input.trim().split(\\s+);
用于(字符串str:splittedParts)
{
如果(!allowedStrings.contains(str))
{
isValidInput=假;
System.out.println(“找到无效单词:+str”);
打破
}
}
if(isValidInput)
{
用于(字符串str:splittedParts)
{
if(str.equalsIgnoreCase(“零”)){
结果+=0;
}
否则如果(str.equalsIgnoreCase(“一”)){
结果+=1;
}
否则如果(str.equalsIgnoreCase(“两”)){
结果+=2;
}
否则如果(str.equalsIgnoreCase(“三”)){
结果+=3;
}
否则如果(str.equalsIgnoreCase(“四”)){
结果+=4;
}
否则如果(str.equalsIgnoreCase(“五”)){
结果+=5;
}
否则如果(str.equalsIgnoreCase(“六”)){
结果+=6;
}
否则如果(str.equalsIgnoreCase(“七”)){
结果+=7;
}
否则如果(str.equalsIgnoreCase(“八”)){
结果+=8;
}
否则如果(str.equalsIgnoreCase(“九”)){
结果+=9;
}
否则如果(str.equalsIgnoreCase(“十”)){
结果+=10;
}
else if(str.equalsIgnoreCase(“十一”)){
结果+=11;
}
否则如果(str.equalsIgnoreCase(“十二”)){
结果+=12;
}
否则如果(str.equalsIgnoreCase(“十三”)){
结果+=13;
}
否则如果(str.equalsIgnoreCase(“十四”)){
结果+=14;
}
否则如果(str.equalsIgnoreCase(“十五”)){
结果+=15;
}