09 Nisan 2009

Java listelerinizi, dizilerinizi sıramala

Merhaba,

Elinizde bir liste ve dizi var. Listedeki nesnelerin bir veya birden çok özelliğine göre listeyi sıralamak istiyorsunuz. Aşağıdaki utility sınıf tam bu iş için. Birden fazla özelliğe göre de sıralayabilirsiniz.

import java.lang.reflect.Method;

import java.util.Arrays;

import java.util.Collections;

import java.util.List;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

 

/**

 * @author M Morkoc

 * Bu sınıf ile nesne dizisi veya collection yapısında bulunan elemanlar sıralanır.

 */

public class Sorter {

      private final static Log log = LogFactory.getLog(Sorter.class);

      

      public static void sort(Object[] liste, String metodAdi) {

            sort(liste, new String[] {metodAdi}, true);

      }

 

      /**

       * liste dizisini sıralar.

       */

      @SuppressWarnings("unchecked")

      public static void sort(Object[] liste, String metodAdi, final boolean artan) {

            sort(liste, new String [] {metodAdi}, artan);

      }

 

     

      public static void sort(Object[] liste, String[] metodAdi) {

            sort(liste, metodAdi, true);

      }

 

      /**

       * liste dizisini coklu eleman icin siralar.

       */

      @SuppressWarnings("unchecked")

      public static void sort(Object[] liste, String[] metodAdi, final boolean artan) {

            if (liste.length == 0)

                  return;

            try {

                  final Method[] m = new Method[metodAdi.length];

                  for (int i = 0; i < m.length; i++) {

                        m[i] = liste[0].getClass().getMethod(metodAdi[i], new Class[0]);

                  }

                  Arrays.sort(liste, new ComparatorWithMethodNameList(m, artan));

            } catch (Exception e) {

                  log.error(e);

            }

      }

 

      @SuppressWarnings("unchecked")

      public static void sort(List liste, String metodAdi) {

            sort(liste, new String[] {metodAdi}, true);

      }

 

      /**

       * Gönderilen listeyi metodAdi isimli metodun her nesne için verdiği değerler ile sıralar

       * @author Ahmet Semiz

       */

      @SuppressWarnings("unchecked")

      public static void sort(List liste, String metodAdi, final boolean artan) {

            sort(liste, new String[] {metodAdi}, artan);

      }

 

      @SuppressWarnings("unchecked")

      public static void sort(List liste, String[] metodAdi) {

            sort(liste, metodAdi, true);

      }

 

      @SuppressWarnings("unchecked")

      public static void sort(List liste, String[] metodAdi, final boolean artan) {

            if (liste.size() == 0)

                  return;

            try {

                  final Method[] m = new Method[metodAdi.length];

                  for (int i = 0; i < m.length; i++) {

                        m[i] = liste.get(0).getClass().getMethod(metodAdi[i], new Class[0]);

                  }

                  Collections.sort(liste, new ComparatorWithMethodNameList(m, artan));

 

            } catch (Exception e) {

                  log.error(e);

            }

      }

}

Bu sınıf arta tarafta sıralama için aşağıdaki sınıfı kullanıyor. Anlaşılırlığı kolay olması için ayrı bir sınıfta sıralama yapıldı.

 

import java.lang.reflect.Method;

import java.text.Collator;

import java.text.RuleBasedCollator;

import java.util.Comparator;

 

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

 

import tr.com.innova.common.middleware.utils.LocaleHolder;

 

class ComparatorWithMethodNameList implements Comparator<Object> {

 

      private final static Log log = LogFactory.getLog(ComparatorWithMethodNameList.class);

     

      private final Method []m;

      private final boolean ascending;

      private final RuleBasedCollator ruleBasedCollator;

     

      ComparatorWithMethodNameList(Method []m, boolean ascending){

            this.m = m;

            this.ascending = ascending;

            ruleBasedCollator = (RuleBasedCollator) Collator.getInstance(LocaleHolder.getLocale());

      }

     

      public int compare(Object o1, Object o2) {

            try {

                  int sonuc = 0;

                  for (int i = 0; i < m.length; i++) {

                        Object obj1 = m[i].invoke(o1, new Class[] {});

                        Object obj2 = m[i].invoke(o2, new Class[] {});

                        sonuc = checkNullsAndCompare(obj1, obj2);

                        if (sonuc != 0) {

                              return sonuc;

                        }

                  }

            } catch (Exception e) {

                  log.error(e.getMessage());

            }

            return 0;

      }

 

      /**

       * @author Ahmet Semiz

       * displayTag projesinden aldım

       */

      @SuppressWarnings("unchecked")

      public final int checkNullsAndCompare(Object object1, Object object2) {

            int returnValue = 0;

           

            if (object1 instanceof String) {

                  returnValue = ruleBasedCollator.compare(object1.toString(), object2.toString());

            } else if (object1 instanceof Comparable && object2 instanceof Comparable) {

                  returnValue = ((Comparable) object1).compareTo(object2);

            } else if (object1 != null && object2 != null) {

                  // if object are not null and don't implement comparable, compare using string values

                  returnValue = ruleBasedCollator.compare(object1.toString(), object2.toString());

            } else if (object1 == null && object2 != null) {

                  returnValue = 1;

            } else if (object1 != null && object2 == null) {

                  returnValue = -1;

            } else {

                  // both null

                  returnValue = 0;

            }

 

            return (ascending ? 1 : -1) * returnValue;

      }

}

 

Kolay gelsin.


Hiç yorum yok: