如何按长度排序数组,然后按字母顺序排序?
我有一个带有数字的东西列表,我目前正在:
Something1 Something10 Something2 Something3
我希望得到:
Something1 Something2 Something3 Something10
答案 0 :(得分:24)
public class MyComparator implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
if (o1.length() > o2.length()) {
return 1;
} else if (o1.length() < o2.length()) {
return -1;
}
return o1.compareTo(o2);
}
}
然后使用:
Collections.sort(yourList, new MyComparator());
答案 1 :(得分:8)
这是一个简洁的Java 8解决方案:
List<String> list = Arrays.asList("Something1", "Something10", "Something2", "Something3");
list.sort(Comparator.comparing(String::length).thenComparing(String::compareTo));
或者,不区分大小写的版本:
list.sort(Comparator.comparing(String::length).thenComparing(String::compareToIgnoreCase));
答案 2 :(得分:4)
创建一个首先按长度进行比较的比较器,如果长度相同,则使用String.compareTo()。
答案 3 :(得分:1)
首先按长度排序,然后词法排序仅在字符串前缀(即数字前面的部分)在所有情况下都是相同的长度时才起作用。我相信你可能真的想要写一个比较器来分隔字符串和数字部分,并按字母顺序对字符串进行排序,并在数字部分按字母顺序排序。
答案 4 :(得分:1)
通过使用 lambda,java 程序看起来像。
import java.util.Arrays;
import java.util.List;
public class Test1 {
public static void main(String[] args) {
String str = "This is am example";
List<String> strl = Arrays.asList(str.split(" "));
strl.sort( (o1,o2)->{
if(o1.length() > o2.length()) return 1;
else if(o1.length() < o2.length()) return -1;
else return o1.compareTo(o2);
});
System.out.println(strl);
}
}
答案 5 :(得分:0)
定义一个类来保存你的项目。好像你希望它成为一个字符串。
对于该类,您需要定义Comparable接口并将逻辑放在其抽象方法中进行比较。
int compareTo(T o)
例如:
class MyString extends String { @Override int compareTo(Object obj) { // put your logic in here. // Return -1 if this is "less than" obj. // Return 0 if this is equal to obj // Return 1 if this is "greater than" obj. // Test length first if (length() < obj.length()) return -1; if (length() > obj.length()) return 1; // Lengths are the same, use the alphabetical compare defined by String already return super.compareTo(obj); } }
免责声明,我实际上没有测试过这段代码,但它应该接近你想要的。