我需要根据Regex模式对名称进行排序,我该怎么办?

时间:2011-12-08 07:07:22

标签: java regex sorting

我需要对名字进行排序。并且这些名称有时会带有数字的统计数据,如果名称有,如果没有,我如何对数字进行排序。目前我只排序字母表。

Ex: 3.Animal
    1.Box
    4.Monkey
    2.Tiger

但我需要在上面显示如下。

1.Box
2.Tiger
3.Animal
4.Monkey

我是否需要正则表达式,如果是,我需要什么样的RE?

如果没有我在java中如何处理。

提前致谢。

4 个答案:

答案 0 :(得分:3)

正则表达式看起来似乎是合理的第一步。你知道Comparator吗?它定义了一个方法int compare(T one, T two),它具有通常的int-as-comparison-result语义。获得Comparator的实例后,您可以将其传递给排序方法,例如Collections.sort

因此,一种方法是编写Comparator<String> compare方法使用正则表达式提取两个字符串的数字部分,然后进行数值比较。这样做的问题是,每次查看每个字符串时,您都会进行解析,这可能会变得很昂贵。

另一种方法是创建TreeMap<Integer,String>,并插入键值对,其中键是解析的int,值是原始String。然后你可以迭代值集,它们将按关键顺序出现。那可能是我采取的方法。

编辑 yytg提出了一个很好的观点,就是对于这样一个简单的解析,你可以在"\\."(限制为2)和解析时进行良好的分割。左手边。您也可以使用String.indexOf找到点,然后使用String.substring来获取点左侧字符串的部分。

答案 1 :(得分:1)

比较专家是正确的,MalTec很接近,但会在“11.Liger”处翻身或在任何地方为空。 UBER STRING SORTER是......

public static void main( String[] args ) {
    List<String> theStrings = Arrays.asList( new String[] {
            "3.Animal",
            "1.Box",
            "4.Monkey",
            "2.Tiger",
            "11.Panzerkampfwagen",
            null,
            null,
            "127.0.0.1" } );
    Collections.sort( theStrings, new Comparator<String>() {
        Pattern pattern = Pattern.compile( "(\\d+).*" );

        @Override
        public int compare( String s1, String s2 ) {
            if ( s1 == null && s2 == null ) {
                return 0;
            } else if ( s1 != null && s2 == null ) {
                return -1;
            } else if ( s1 == null && s2 != null ) {
                return 1;
            } else {
                Matcher s1Matcher = pattern.matcher( s1 );
                Matcher s2Matcher = pattern.matcher( s2 );
                if ( !s1Matcher.matches() && !s2Matcher.matches() ) {
                    return s1.compareTo( s2 );
                } else if ( s1Matcher.matches() && !s2Matcher.matches() ) {
                    return -1;
                } else if ( !s1Matcher.matches() && s2Matcher.matches() ) {
                    return 1;
                } else {
                    int i1 = Integer.parseInt( s1Matcher.group( 1 ) );
                    int i2 = Integer.parseInt( s2Matcher.group( 1 ) );
                    return i1 - i2;
                }
            }
        }

    } );
    System.out.println( theStrings );
}

输出

[1.Box, 2.Tiger, 3.Animal, 4.Monkey, 11.Panzerkampfwagen, 127.0.0.1, null, null]

答案 2 :(得分:0)

您可以使用自定义&#39;比较器&#39; - 看here - 不需要正则表达式 - 你可以用&#39;来分割字符串。&#39;然后在左侧将其转换为数字

答案 3 :(得分:0)

如果你有。表格,固定的所有记录,下面的代码应该为你工作..不需要正则表达式..并且希望这不是你在这里问的一些教程

String[] source={"3.Animal","1.Box","4.Monkey","2.Tiger"};


Arrays.sort(source, new Comparator<String>() {
  @Override
  public int compare(String s1, String s2) {

      // to the start of the other, or else throwing an exception)
       if ((s1.indexOf('.') == -1) || (s2.indexOf('.') == -1)) { // both or neither
                return 0;
        }
        return s1.compareTo(s2);
   }
});


for(int i=0;i<source.length;i++){
    System.out.println("String - "+i+" : "+source[i]);
}