3

我在java中编写了一个java程序来按字母顺序对字符串进行排序。问题是当它对具有罗马数字的字符串进行排序时,它会将其视为字符并相应地进行排序

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class SampleCustomSortApp
{
    @SuppressWarnings("unchecked")
    public static void main(String[] args)
    {
        ArrayList<String> titles =new ArrayList();
        titles.add("java");
        titles.add("J-IV");
        titles.add("A-V");
        titles.add("J-V");
        titles.add("J-IX");
        titles.add("J-XX");
        titles.add("J-X");
        titles.add("J-I");
        titles.add("J-II");

        titles.add("datawarehouse");
        titles.add("oracledba");
        System.out.println("Before Sorting Elements Are :"+titles+"\n");
        Collections.sort(titles, new MyCustomCompator());
        System.out.println("After Sorting Elements Are :"+titles);
    }
}
class MyCustomCompator implements Comparator
{
    public int compare(Object s1,Object s2)
    {
        String one = (String)s1;
        String two = (String)s2;
        /* for ascending order */
        if(one.compareTo(two)>0){
            return 1;
        }else{
            return -1;
        }
    }
}

实际输出

Before Sorting Elements Are :[java, J-IV, A-V, J-V, J-IX, J-XX, J-X, J-I, J-II, datawarehouse, oracledba]

After Sorting Elements Are :[A-V, J-I, J-II, J-IV, J-IX, J-V, J-X, J-XX, datawarehouse, java, oracledba]

期望的输出

Before Sorting Elements Are :[java, J-IV, A-V, J-V, J-IX, J-XX, J-X, J-I, J-II, datawarehouse, oracledba]

After Sorting Elements Are :[A-V, J-I, J-II, J-IV,  J-V,J-IX, J-X, J-XX, datawarehouse, java, oracledba]

我应该使用正则表达式来比较字符串。有人能告诉我解决方案吗

4

2 回答 2

5

你肯定需要你自己的Comparator,它可以适当地解析罗马数字。解析的工作(自然)已经解决了,所以您只需要将字符串拆分为字母和数字部分。有关罗马数字解析代码的示例,请参见此处。

于 2013-05-28T13:16:07.597 回答
1

如果您能够提取字符串中的罗马数字,则可以在 Comparator 中使用罗马数字解析器。用阿拉伯数字替换罗马数字,然后比较字符串。您必须用零填充阿拉伯数字,以便它们都具有相同的位数。这是Rosetta Code中的 Java 解析器示例。

于 2013-05-28T13:21:10.397 回答