сортировка java с использованием анонимного класса

у меня есть класс, в котором я сортировки списка.

import java.util.*;

public class First 
{

    private static HashMap<String,Second> msgs;

    public static void main(String[] args) 
    {           

    List<String> ls=new ArrayList<String>();


   ls.add("fourth");
   ls.add("2");
   ls.add("second");
   ls.add("first");
   ls.add("third");
   ls.add("1");

   Iterator it=ls.iterator();

   // before sorting
   while(it.hasNext())
   {
     String s=(String)it.next();
     System.out.println(s);
   }

   Collections.sort(ls, new Comparator(){
       public int compare(Object o1, Object o2) {
           return -1;
           // it can also return 0, and 1
        }
    });

System.out.println(" ");

//after sorting
   Iterator iti=ls.iterator();
   while(iti.hasNext())
   {
     String s=(String)iti.next();

     System.out.println(s);
   }

}


}

после запуска программы я получаю следующие значения:

1    
third
first
second
2
fourth

мой вопрос в том, что поведение коллекции.сортировать() функция здесь. При возврате -1 из функции сравнения мы получаем обратный порядок списка. Тогда как мы можем получить другие заказы на сортировку? Какова роль возврата 0 и 1?

6 ответов


наконец, я изменил функцию сортировки таким образом, чтобы получить отсортированные данные.

 Collections.sort(ls, new Comparator() 
                           {

                            public int compare(Object o1, Object o2) 
                            {
                            String sa = (String)o1;
                            String sb = (String)o2;

                            int v = sa.compareTo(sb);

                            return v;           

                                // it can also return 0, and 1
                            }
                           }    
                    );

вот что в Javadoc говорит:

int сравнить (T o1, T o2)

сравнивает два своих аргумента для порядка. Возвращает отрицательное целое число, ноль или положительное целое число, так как первый аргумент меньше, равно или больше, чем второй.

ваша реализация компаратора не соблюдает этот контракт, поэтому результат неопределенный. Он должен возвращать отрицательное значение, если он считает, что o1 меньше o2. Он должен возвращает положительное значение, если оно считает, что o1 больше o2. И он должен возвращать 0, если он считает, что o1 равен o2. И, конечно, она должна быть последовательной. Если o1 o1. Если o1


вы можете использовать анонимный класс таким образом:

TreeSet<String> treeSetObj = new TreeSet<String>(new Comparator<String>() {
    public int compare(String i1,String i2)
    {
        return i2.compareTo(i1);
    }
});

java.util.Comparator класса, говорится в compare метод Java doc:

отрицательное целое число, нуль, или положительное целое число как первый аргумент меньше, равен, или больше второй.

вы можете использовать следующий код:

Collections.sort(ls, new Comparator() 
{
    public int compare(Object o1, Object o2) 
    {
       if(o1 instanceof String && o2 instanceof String) 
       {
          String s_1 = (String)o1;
          String s_2 = (String)o2;

          return s_1.compareTo(s_2);
       } 
       return 0;    
    }
});

этот код должен работать нормально.Вы можете изменить метод compare для большей гибкости.

compareTo метод String класс говорит в своем Java doc:

значение 0 если строка аргумента равна эта строка; значение меньше 0 если эту строку лексикографически меньше, чем аргумент string; и a значение больше 0 если эта строка лексикографически больше, чем аргумент string.


какова роль возврата 0 и 1?

это значит, что o1 равен o2, или o1 больше o2.

ваш анонимный компаратор в настоящее время говорит, что o1 меньше o2,для каждого возможного значения o1 и o2. Это просто не имеет смысла и вызывает поведение sort быть непредсказуемым.

A действительный компаратор должен реализовать compare(Object, Object) метод так, что он ведет себя в соответствии с требованиями Comparator интерфейс.


если ваша реальная цель-изменить порядок элементов в списке, то не используйте sort. Использовать Collections.reverse()


из Javadoc компаратора

Compares its two arguments for order.  Returns a negative integer,
 zero, or a positive integer as the first argument is less than, equal
 to, or greater than the second.

поэтому определите функциональность меньше, равна или больше ,чем для вашего класса, вам не хватает равных и больше, чем функциональность.