Сортировка списка <> по числовому значению

1

У меня есть public List<FriendProfile> friends = new ArrayList<FriendProfile>(); , Я инициализирую список друзей, читая информацию с сервера. Объект private int userPosition; содержит int, называемый private int userPosition;

После того, как список друзей был инициализирован, я хотел бы отсортировать список друзей, userPosition объект userPosition с наивысшим значением userPosition в индексе 0 списка, а затем отсортировать соответственно индекс 1 со вторым самым высоким userPosition...

Я думаю, я мог бы написать алгоритм сортировки, но я ищу предварительно написанный код (возможно, у JDK есть несколько способов предложить?)

Помощь приветствуется!

Теги:
list
sorting

7 ответов

6
Лучший ответ

Используйте Collections.sort() и укажите Comparator:

Collections.sort(friends,
                 new Comparator<FriendProfile>()
                 {
                     public int compare(FriendProfile o1,
                                        FriendProfile o2)
                     {
                         if (o1.getUserPosition() ==
                                 o2.getUserPosition())
                         {
                             return 0;
                         }
                         else if (o1.getUserPosition() <
                                      o2.getUserPosition())
                         {
                             return -1;
                         }
                         return 1;
                     }
                 });

или иметь FriendProfile реализовать Comparable<FriendProfile>.

  • 0
    Спасибо - Не могли бы вы привести пример и Comparator, где он сортирует высокое значение по низкому значению?
  • 0
    @LukeTaylor просто поменяйте местами "o1" на "o2" в примере hmjd. Вот так: public int сравнивать (FriendProfile o2, FriendProfile o1)
Показать ещё 1 комментарий
1

Теперь нет необходимости в боксе (т.е. Нет необходимости создавать OBJECT с использованием нового значения использования оператора, если он установлен с помощью CompareTo of Collections.Sort..)

1) В порядке возрастания

Collections.sort(temp, new Comparator<XYZBean>() 
{
     @Override
     public int compare(XYZBean lhs, XYZBean rhs) {

       return Integer.valueOf(lhs.getDistance()).compareTo(rhs.getDistance());
      }
 });

1) Для деактивации

Collections.sort(temp, new Comparator<XYZBean>() 
{
     @Override
     public int compare(XYZBean lhs, XYZBean rhs) {

       return Integer.valueOf(rhs.getDistance()).compareTo(lhs.getDistance());
      }
 });
  • 0
    Не работает для меня!
1

Внедрить сравнимый интерфейс.

class FriendProfile implements Comparable<FriendProfile> {

    private int userPosition;

    @Override
    public int compareTo(FriendProfile o) {

        if(this.userPosition > o.userPosition){
            return 1;
        }
        return 0;
    }

}

Просто вызовите метод Collection.sort(List).

    FriendProfile f1=new  FriendProfile();
    f1.userPosition=1;
    FriendProfile f2=new  FriendProfile();
    f2.userPosition=2;
    List<FriendProfile> list=new ArrayList<FriendProfile>();
    list.add(f2);
    list.add(f1);
    Collections.sort(list);

Список будет отсортирован.

0

You can use интерфейс java.lang.Comparable, если хотите отсортировать только один способ.

But if you want to sort более чем одним способом, используйте интерфейс java.util.Compartor.

например:

Класс, объекты которого должны быть отсортированы по его roll_nos

public class Timet {

    String name;
    int roll_no;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getN() {
        return roll_no;
    }
    public void setN(int n) {
        this.roll_no = n;
    }
    public Timet(String name, int n) {

        this.name = name;
        this.roll_no = n;
    }

    public String toString(){
        return this.getName();



    }

}

Класс для сортировки:

public class SortClass {


    public void go(){

        ArrayList<Timet> arr = new ArrayList<Timet>();
        arr.add(new Timet("vivek",5));
        arr.add(new Timet("alexander",2));
        arr.add(new Timet("catherine",15));

        System.out.println("Before Sorting :"+arr);





        Collections.sort(arr,new SortImp());

        System.out.println("After Sorting :"+arr);


    }
    class SortImp implements Comparator<Timet>{

        @Override
        public int compare(Timet t1, Timet t2) {




            return new Integer(t1.getN()).compareTo (new Integer((t2.getN())));
        }



    }
    public static void main(String[] args){

        SortClass s = new SortClass();
        s.go();

    }

}
0

Есть два способа сделать это.

1. FriendProfile может реализовать интерфейс Comparable.

public class FriendProfile implements Comparable<FriendProfile>
{
   public int compareTo(FriendProfile that)
   {
     // Descending order
     return that.userPosition - this.userPosition;
   }
}

...

Collections.sort(friendProfiles);

2. Вы можете написать Компаратор.

public class FriendProfileComparator implements Comparator<FriendProfile>
{
   public int compare(FriendProfile fp1, FriendProfile fp2) 
   {
     // Descending order
     return fp2.userPosition - fp1.userPosition;
   }
}

...

Collections.sort(friendProfiles, new FriendProfileComparator());

При сравнении объектов, а не примитивов, обратите внимание на то, что вы можете делегировать объекты-обтекатели compareTo. например, return fp2.userPosition.compareTo(fp1.userPosition)

Первый полезен, если объект имеет естественный порядок, который вы хотите реализовать. Например, Integer реализует для числового порядка, String реализует для алфавита. Второй полезен, если вам нужны разные заказы при разных обстоятельствах.

Если вы пишете Comparator, тогда вам нужно подумать, куда его поместить. Поскольку он не имеет состояния, вы можете записать его как Singleton или статический метод FriendProfile.

0

Используйте Collections.Sort и напишите собственный Comparator который сравнивается на основе userPosition.

  • 0
    Спасибо - Не могли бы вы привести пример и Comparator, где он сортирует высокое значение по низкому значению?
0

использовать метод Comparator with Collections.sort

java.util.Collections.sort(list, new Comparator<FriendProfile >(){
     public int compare(FriendProfile a,  FriendProfile b){
          if(a.getUserPosition() > b.getUserPosition()){
             return 1;
           }else if(a.getUserPosition() > b.getUserPosition()){
            return -1;
         }
          return 0;
     }
});

посмотреть ссылку

  • 0
    Спасибо - Не могли бы вы привести пример и Comparator, где он сортирует высокое значение по низкому значению?
  • 0
    не уверен, можно попробовать: просто измените возврат -1 на 1 и 1 на -1
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню