[英]Sort a Java List of Objects
我有一个Java对象列表
List<MyObject> list = new ArrayList<>();
list.add(new MyObject("1", "1"));
list.add(new MyObject("2", "2"));
list.add(new MyObject("3", "3"));
list.add(new MyObject("4", "12"));
list.add(new MyObject("5", "1d2"));
我的对象是
Public MyObject {
String id;
String myNumber;
...
}
现在我想按数字对myNumber排序,所以我想要一个结果:
MyObject("5", "1d3");
MyObject("4", "12");
MyObject("3", "3");
MyObject("2", "2");
MyObject("1", "1");
我怎样才能做到这一点?
与list.sort(Comparator.comparing(MyObject :: getMyNumber)); 给我
MyObject("3", "3");
MyObject("2", "2");
MyObject("5", "1d3");
MyObject("4", "12");
MyObject("1", "1");
我建议您在实现“可比较”时在对象内部编写自己的比较方法
就像是
公共类CompareObject实现Comparable {
String id;
String myNumber;
public CompareObject(String id, String myNumber) {
this.id = id;
this.myNumber = myNumber;
}
public int compareTo(CompareObject c) {
String myNumberOnlyNumbers = "";
String otherNumberOnlyNumbers = "";
for(int i = 0; i < myNumber.length(); i++) {
try {
myNumberOnlyNumbers += Integer.parseInt(myNumber.charAt(i)+"") + "";
} catch (NumberFormatException e) {
}
}
for(int i = 0; i < c.myNumber.length(); i++) {
try {
otherNumberOnlyNumbers += Integer.parseInt(c.myNumber.charAt(i)+"") + "";
} catch (NumberFormatException e) {
}
}
return Integer.compare(Integer.parseInt(myNumberOnlyNumbers), Integer.parseInt(otherNumberOnlyNumbers));
}
}
在您的情况下,“ CompareObject”将是“ MyObject”
之后,你可以做
List<CompareObject> list = new ArrayList<>();
list.add(new CompareObject("1", "1"));
list.add(new CompareObject("2", "2"));
list.add(new CompareObject("3", "3"));
list.add(new CompareObject("4", "12"));
list.add(new CompareObject("5", "1d3"));
Collections.sort(list, Collections.reverseOrder()); //Collections.reverseOrder() meaning in descending order here
如果我愿意
for(int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).id + " - " + list.get(i).myNumber);
}
打印我得到的清单
5 - 1d3
4 - 12
3 - 3
2 - 2
1 - 1
AFAIK没有内置的Java解决方案,但是在Java开发人员中,这被称为AlphaNumeric排序,您可以在此处找到一些示例代码。
https://github.com/my-flow/alphanum/blob/master/src/AlphanumComparator.java
Collections.sort(list, new Comparator<MyObject>() {
@Override
public int compare(MyObject o1, MyObject o2) {
String one = o1.myNumber;
String two = o2.myNumber;
if (isNumeric(one) && isNumeric(two)) {
return Integer.valueOf(two).compareTo(Integer.valueOf(one));
} else {
return two.compareTo(one); //add new fuction here to compare strings having alphabets
}
}
});
for(int i=0; i<list.size(); i++){
System.out.println(list.get(i));
}
isNumeric方法:
public static boolean isNumeric(String str) {
try {
Double.parseDouble(str);
return true;
} catch(NumberFormatException e){
return false;
}
}
list.sort(Comparator.comparingLong(myobj ->
Long.parseLong(myobj.getMyNumber().replaceAll("\\D", "")
.replaceFirst("^$", "0"))
.reversed());
假设您要:
(这就是我从您的示例中读取的内容:13、12、3、2、1。)
最简单的方法是提供从MyObject派生long的long / int函数。
( replaceFirst
确保没有任何数字的值将产生0。)
List<MyObject> list = new ArrayList<>();
list.add(new MyObject("1", "1"));
list.add(new MyObject("2", "2"));
list.add(new MyObject("3", "3"));
list.add(new MyObject("4", "12"));
list.add(new MyObject("5", "1d2"));
Collections.sort(list, new Comparator<MyObject>() {
@Override
public int compare(MyObject o1, MyObject o2) {
if(Integer.parseInt(o1.getId())<=Integer.parseInt(o2.getId()))
{
return 1;
}else
return -1;
}
});
for(int i=0;i<list.size();i++)
{
System.out.println(list.get(i));
}
我认为问题背后的问题是“如何从字符串中提取数字”,在这种情况下可以很好地回答。 从Java中的字符串中提取数字
myNumber= myNumber.replaceAll("\\D+","");
您可以创建自己的比较器来轻松处理结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.