2016-06-10 3 views
-2

У меня есть список массивов с полями объектов 4. Мне нужно знать, как упорядочить поля моего объекта «один за другим», используя общие методы, которые выполняют алгоритмы (isort, msort, qsort) ,Поле заказа объекта Java arraylist

Я знаю, что интерфейс компаратора, но не знаю, как проверить все поля в родовом типе T.

+0

Что вы подразумеваете под "поле заказа объекта"? Можете ли вы привести пример? – Pshemo

ответ

0

Если я понял вас правильно, вы получили класс, который служит в качестве универсального типа и хочу знать, как используйте интерфейс Comparator с этим. Вот моя попытка:

class ClassWithFields { 

    int fieldA; 
    double fieldB; 
    String fieldC; 

    public ClassWithFields(int fieldA, double fieldB, String fieldC) { 
     this.fieldA = fieldA; 
     this.fieldB = fieldB; 
     this.fieldC = fieldC; 
    } 

    @Override 
    public String toString() { 
     return "["+fieldA+","+fieldB+","+fieldC+"]"; 
    } 

} 

public class GenericComparator<T extends ClassWithFields> implements Comparator<T> { 

    @Override 
    public int compare(T o1, T o2) { 
     if (o1.fieldA < o2.fieldA) 
      return -1; 
     else if (o1.fieldA > o2.fieldA) 
      return +1; 
     else if (o1.fieldB < o2.fieldB) 
      return -1; 
     else if (o1.fieldB > o2.fieldB) 
      return +1; 
     else 
      return o1.fieldC.compareTo(o2.fieldC); 
    } 

    public static void main(String[] args) { 
     ClassWithFields[] cwfArray = new ClassWithFields[3]; 
     cwfArray[0] = new ClassWithFields(2, 1.5, "Test"); 
     cwfArray[1] = new ClassWithFields(1, 3.5, "Test"); 
     cwfArray[2] = new ClassWithFields(2, 1.5, "Tast"); 
     Arrays.sort(cwfArray, new GenericComparator<ClassWithFields>()); 
     System.out.println(Arrays.toString(cwfArray)); 
    } 

} 

При запуске основной метод, то первый элемент массива будет установлен на задней части массива, потому что 1 < 2 и «а» < «е» (также 3,5 < 1,5, но мы туда не ездим, потому что у нас есть порядок, в котором сравниваются поля) Ответит ли это на вопрос?

EDIT: Это должно сделать это сейчас.

public class GenericComparator<T extends ClassWithFields> implements Comparator<T> { 

    private String fieldIdentifier; 

    public GenericComparator(String fieldIdentifier) 
    { 
     this.fieldIdentifier = fieldIdentifier; 
    } 

    @Override 
    public int compare(T o1, T o2) { 
     if (fieldIdentifier.equals("fieldA")) { 
      if (o1.fieldA < o2.fieldA) 
       return -1; 
      else if (o1.fieldA > o2.fieldA) 
       return +1; 
      return 0; 
     } 
     else if (fieldIdentifier.equals("fieldB")) { 
      if (o1.fieldB < o2.fieldB) 
       return -1; 
      else if (o1.fieldB > o2.fieldB) 
       return +1; 
      return 0; 
     } 
     else 
      return o1.fieldC.compareTo(o2.fieldC); 
    } 

    public static <S extends ClassWithFields> void isort(ArrayList<S> array, String type) { 
     Comparator<S> comp = new GenericComparator<S>(type); 
     // TODO employ search algorithm 
     S help = null; 
     for (int i = 0; i < array.size(); i++) { 
      for (int j = 0; j < array.size(); j++) { 
       if (comp.compare(array.get(i), array.get(j)) > 0) { 
        help = array.get(i); 
        array.set(i, array.get(j)); 
        array.set(j, help); 
       } 
      } 
     } 
    } 

    public static void main(String[] args) { 
     ClassWithFields[] cwfArray = new ClassWithFields[3]; 
     cwfArray[0] = new ClassWithFields(2, 1.5, "Test"); 
     cwfArray[1] = new ClassWithFields(1, 3.5, "Test"); 
     cwfArray[2] = new ClassWithFields(2, 1.5, "Tast"); 
     ArrayList<ClassWithFields> cwfList = new ArrayList<ClassWithFields>(); 
     Collections.addAll(cwfList, cwfArray); 
     isort(cwfList, "fieldA"); 
     System.out.println(Arrays.toString(cwfList.toArray())); 
    } 

} 
+0

это, как вы описали, единственное, что я не могу использовать array.sort, но метод сортировки со списком параметров массива и строку, которая сообщает мне, как мне сортировать список массивов (в зависимости от того, в каком поле Объект ClassWithFields. это должен быть заголовок метода. public static void isort (ArrayList array, String type) – jhashing

+0

Я понял, прочитав спецификации, которые не могут расширять или задавать классы, где я реализую методы сортировки; почему они должны оставаться универсальными и могут работать с любым классом данных – jhashing