我想对包含数字的String列表进行排序。
例如,我有一个包含元素"1,2,3,4,5,11,12,21,22,31,32,A101,A102,A103,A104,B405"
的列表。
如果我使用Collection.sort方法,则表示输出为"1,11,12,2,21,22,3,31,32... "
。
如果我使用比较器功能意味着它给出
输出为"1,2,3,4,5,11,12,21,22,31,32,A101... ".
但我需要显示为
"A101,A102,A103,A104,B405,1,2,3,4,5,11,12,21,22,31,32"
请任何人给我一个解决方案。提前谢谢。
答案 0 :(得分:2)
实现自己的比较器,尝试将要比较的对象转换为整数,如果成功,则使用Integer类的compareTo,否则使用String类的compareTo。
像这样:
public class MyComparator implements Comparator<String,String>
{
public int compare(String s1, String s2)
{
try
{
int i1 = Integer.parseInt(s1);
int i2 = Integer.parseInt(s2);
return i1 - i2;
}
catch (NumberFormatException e)
{
return s1.compareTo(s2);
}
}
}
ArrayList<String> myList = (...);
Collections.sort(myList,new MyComparator());
如评论所述,这类似1,12,A102,A103
。但想要的是:A102,A103,1,12
。为此,我们需要处理s1
可解析为int且s2
不可解决的情况,反之亦然。我不确定我是否正确-1
和1
,所以也许他们应该互换。
public class MyComparator implements Comparator<String,String>
{
public int compare(String s1, String s2)
{
Integer i1 = null
Integer i2 = null
try
{
i1 = Integer.parseInt(s1);
}
catch (NumberFormatException e) {}
try
{
i2 = Integer.parseInt(s2);
}
catch (NumberFormatException e) {}
if (i1 == null && i2 == null)
return s1.compareTo(s2);
if (i1 == null && i2 != null)
return -1;
if (i1 != null && i2 == null)
return 1;
return i1 - i2;
}
}
答案 1 :(得分:0)
创建一个新的&#34;持有者&#34;字符串的对象并实现Comparable接口。覆盖&#34; compareTo&#34;方法。这应该可以解决问题;)
答案 2 :(得分:0)
答案存在于您的问题中,只需创建两个列表并单独排序!
package com.kvvssut.misc;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class SortStringThenNumber {
public static void main(String[] args) {
List<String> inputs = Arrays.asList(new String[]{"1","5","3","4","2","11","11","21","31","32","22","A101","A103","A104","B405","A102"});
List<Object> result = sortStringThenNumber(inputs);
for (Object sorted : result) {
System.out.println(String.valueOf(sorted));
}
}
private static List<Object> sortStringThenNumber(List<String> inputs) {
List<Integer> numbers = new ArrayList<Integer>();
List<String> strings = new ArrayList<String>();
for (String input : inputs) {
if (input.matches("-?\\d+")) {
numbers.add(Integer.valueOf(input));
} else {
strings.add(input);
}
}
inputs = null;
Collections.sort(numbers);
Collections.sort(strings);
ArrayList<Object> all = new ArrayList<Object>();
all.addAll(strings);
all.addAll(numbers);
return all;
}
}