简体   繁体   English

排序Java对象列表

[英]Sort a Java List of Objects

i have a Java Object List 我有一个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"));

My Objects Are 我的对象是

Public MyObject {
String id;
String myNumber;
...
}

now i want to sort my list by myNumber by only numbers so i want a result: 现在我想按数字对myNumber排序,所以我想要一个结果:

MyObject("5", "1d3");
MyObject("4", "12");
MyObject("3", "3");
MyObject("2", "2");
MyObject("1", "1");

How can i do this? 我怎样才能做到这一点?

with list.sort(Comparator.comparing(MyObject::getMyNumber)); 与list.sort(Comparator.comparing(MyObject :: getMyNumber)); gives me 给我

MyObject("3", "3");
MyObject("2", "2");
MyObject("5", "1d3");
MyObject("4", "12");
MyObject("1", "1");

I would suggest you write your own compare method inside your object while implementing "Comparable" 我建议您在实现“可比较”时在对象内部编写自己的比较方法

something like 就像是

public class CompareObject implements Comparable{ 公共类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));
}

} }

in your case "CompareObject" would be "MyObject" 在您的情况下,“ CompareObject”将是“ MyObject”

after that you can do 之后,你可以做

    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

and if i do 如果我愿意

    for(int i = 0; i < list.size(); i++) {
        System.out.println(list.get(i).id + " - " + list.get(i).myNumber);
    }

to print the list i get 打印我得到的清单

5 - 1d3
4 - 12
3 - 3
2 - 2
1 - 1

AFAIK there is no java in built solution, but among java developers this is famous as AlphaNumeric sorting and you can find some sample code here. AFAIK没有内置的Java解决方案,但是在Java开发人员中,这被称为AlphaNumeric排序,您可以在此处找到一些示例代码。

https://github.com/my-flow/alphanum/blob/master/src/AlphanumComparator.java 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 method: 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());

This assumes you want: 假设您要:

  • to discard all non-digit characters 丢弃所有非数字字符
  • sort numerically descending 按数字降序排列

(That is what I read from your example: 13, 12, 3, 2, 1.) (这就是我从您的示例中读取的内容:13、12、3、2、1。)

The easiest is to provide a long/int function that derives a long from a MyObject. 最简单的方法是提供从MyObject派生long的long / int函数。

(The replaceFirst ensures that as value without any digit will yield 0.) 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));
    }

I think you problem behind your question shall be 'how to extract numbers from a string', which is well answered in this case. 我认为问题背后的问题是“如何从字符串中提取数字”,在这种情况下可以很好地回答。 Extract digits from a string in Java 从Java中的字符串中提取数字

myNumber= myNumber.replaceAll("\\D+","");

And you can create you own comparator to handle the result easily. 您可以创建自己的比较器来轻松处理结果。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM