我需要对名字进行排序。并且这些名称有时会带有数字的统计数据,如果名称有,如果没有,我如何对数字进行排序。目前我只排序字母表。
Ex: 3.Animal
1.Box
4.Monkey
2.Tiger
但我需要在上面显示如下。
1.Box
2.Tiger
3.Animal
4.Monkey
我是否需要正则表达式,如果是,我需要什么样的RE?
如果没有我在java中如何处理。
提前致谢。
答案 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]);
}