Сортировать список объектов Java - PullRequest
2 голосов
/ 30 апреля 2019

у меня есть список объектов 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");

Ответы [ 6 ]

0 голосов
/ 30 апреля 2019

Я думаю, что проблема, стоящая за вашим вопросом, заключается в том, «как извлечь числа из строки», и в этом случае на этот вопрос есть хороший ответ. Извлечение цифр из строки в Java

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

И вы можете создать свой собственный компаратор, чтобы легко обрабатывать результат.

0 голосов
/ 30 апреля 2019
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));
    }
0 голосов
/ 30 апреля 2019
list.sort(Comparator.comparingLong(myobj ->
                        Long.parseLong(myobj.getMyNumber().replaceAll("\\D", "")
                                                          .replaceFirst("^$", "0"))
                    .reversed());

Предполагается, что вы хотите:

  • , чтобы отбросить все нецифровые символы
  • сортировать по убыванию чисел

(Это то, что ячитайте из вашего примера: 13, 12, 3, 2, 1.)

Самый простой - предоставить функцию long / int, которая получает long из MyObject.

(replaceFirst гарантирует, что значение без цифры даст 0.)

0 голосов
/ 30 апреля 2019
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;
    }
}
0 голосов
/ 30 апреля 2019

AFAIK В Java нет встроенного решения, но среди разработчиков Java это известно как AlphaNumeric sorting, и вы можете найти некоторый пример кода здесь.

https://github.com/my-flow/alphanum/blob/master/src/AlphanumComparator.java

0 голосов
/ 30 апреля 2019

Я бы посоветовал вам написать свой собственный метод сравнения внутри вашего объекта при реализации "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));
}

}

в вашем случае «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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...