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;
}