2013-06-06 4 views
1

Есть ли такой метод, который я могу использовать, чтобы я мог передавать любой список любых объектов, и он вернет отсортированный список в том порядке, который я хочу?Сортировка списка объектов

сортировки общественного List (Список listToBeSorted, порядок String, String свойство) { }

class Person{ 
    private String name; 
    private Date dob; 
    private int age; 
} 

Так что, если я называю выше метод следующим образом:

sort(myList, "ascending", "name"); 

Он будет сортировать список в порядке возрастания свойства «name» объекта person.

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

public class PersonComparator { 
    public static final Comparator<Person> NAME_COMPARATOR = new Comparator<Person>() { 
     @Override 
     public int compare(Person object1, Person object2) {    
      return object1.getName().compareToIgnoreCase(object2.getName()); 
     }  
    }; 
    public static final Comparator<Person> DOB_COMPARATOR = new Comparator<Person>() { 
     @Override 
     public int compare(Person object1, Person object2) { 
      return object1.getDob().compareTo(object2.getDob()); 
     }  
    }; 
    public static final Comparator<Person> AGE_COMPARATOR = new Comparator<Person>() { 
     @Override 
     public int compare(Person object1, Person object2) { 
      return object1.getAge().compareTo(object2.getAge()); 
     }  
    }; 
} 

и используется компаратор следующим образом:

List<Person> myList = new ArrayList<Person>(); 
Collections.sort(myList, PersonComparator.NAME_COMPARATOR); 

EDIT:

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

+1

В вашей реализации 'Comparator' должно быть что-то не так. Обратите внимание, что вы можете выполнять более сложные правила внутри реализации 'Comparator'. –

+0

Каков был результат? – arynaq

+0

Ну, это должно сработать ... Можете ли вы привести пример данных, где это не так? – fge

ответ

2

Для восходящего и нисходящего, вы можете использовать reverseOrder, чтобы получить другой Comparator. Это поддерживается непосредственно Java и является довольно стандартным методом для достижения эффекта отмены порядка.

Если вы хотите использовать различные поля на основе параметра, вам может понадобиться отражение, чтобы сделать это. Обратите внимание, что перед тем, как сравнить поля, вы можете проверить, было ли поле isAssaignableFromComparable. В противном случае вы можете выбрать бросок IllegalArgumentException или что-то близкое.

3

Проверьте Bean Comparator.

Будет сортировать список в порядке возрастания свойства "имя" объекта person.

Вы можете управлять порядком сортировки, но вы указываете метод доступа к свойству, а не самому свойству.

+0

Я попытался использовать BeanComparator из «org.apache.commons.beanutils.BeanComparator». Но у BeanComparator нет конструктора, который предлагает блог, тот, который принимает класс и строку в качестве параметров. – Susie

+0

@Susie, это НЕ тот же класс, что и org.apache ... – camickr

1

Вы можете реализовать, как это ...

class MyCompartor<E>{ 
    public Comparator<E> getCompartor(final String order,final String propertyName){ 

     return new Comparator<E>() { 

       @Override 
       public int compare(E o1, E o2) { 
         Class noparams[]={}; 
         try { 
          char temp[] = propertyName.toCharArray(); 
          temp[0] = Character.toUpperCase(temp[0]); 
          String tempName=new String(temp); 
          Method method = o1.getClass().getDeclaredMethod("get"+tempName, noparams); 
          Object val1 = method.invoke(o1, null); 
          Object val2 = method.invoke(o2, null); 
          if(order.equalsIgnoreCase("ascending")) 
          { 
           return ((Comparable)val1).compareTo(val2); 
          }else{ 
           return ((Comparable)val2).compareTo(val1); 
          } 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        return 0; 
       } 
      }; 
    } 
} 

и называя то, как этот

Collections.sort(list,new MyCompartor<Person>().getCompartor("ascending", "name")); 

надеюсь, что это помогает ?? , но помните, что свойство должно возвращать объект, который является java.lang.Comparable

+0

и что вам нужно внедрить геттеры: P – DarthCoder

Смежные вопросы