2016-01-14 2 views
0

Можно ли сопоставить классы библиотек без их расширения?Java - Сделать класс библиотеки сопоставимым

import org.json.JSONObject; 

LinkedList<JSONObject> list = getListFromFunction(); 

TreeSet<JSONObject> treeSet = new TreeSet<JSONObject>(list); 

Создание TreeSet здесь не представляется возможным, как JSONObject не сопоставимы. Как я могу «присоединить» пользовательский компаратор к JSONObject?
(Существует уникальное свойство, скажем, «_some_id» для сравнения)

+3

Почему бы не пройти в 'Comparator'? (Действительно, это единственный вариант, который у вас есть.) –

ответ

4

Мы можем использовать компаратор в таком случае и обрабатывать сценарий. Пожалуйста, обратитесь к приведенному ниже примеру.

Главный класс

public class ComparatorTest{ 
    public static void main(String[] ar) { 
     // System.out.println(new Sample().stringTimes("vivek", 5)); 
     JSONObject emp1 = new JSONObject(); 
     JSONObject emp2 = new JSONObject(); 
     try { 
      emp1.put("department", "IT"); 
      emp1.put("name", "bvivek"); 
      emp1.put("id", 1); 

      emp2.put("department", "IT"); 
      emp2.put("name", "avikash"); 
      emp2.put("id", 2); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     List<JSONObject> employess = new ArrayList<JSONObject>(); 
     employess.add(emp1);//add to list 
     employess.add(emp2);//add to list 
     System.out.println(employess);//unsorted, as is 
     Collections.sort(employess, new JSONComparator("name")); 
     System.out.println(employess);//sorted as per the field 
     //using treeSet 
     TreeSet<JSONObject> jsonInTree = new TreeSet<JSONObject>(new JSONComparator("id")); 
     jsonInTree.addAll(employess); 
     System.out.println(jsonInTree);//using the tree implementation 
    } 
} 

JSONComparator

class JSONComparator implements Comparator<JSONObject> { 
    private String fieldToCompare; 

    public JSONComparator(String fieldToCompare) { 
     this.fieldToCompare = fieldToCompare; 
    } 

    @Override 
    public int compare(JSONObject o1, JSONObject o2) { 
     String id1 = ""; 
     String id2 = ""; 
     try { 
      id1 = o1.getString(this.fieldToCompare); 
      id2 = o2.getString(this.fieldToCompare); 
     } catch (JSONException e) { 

     } 

     return id1.compareTo(id2); 
    } 
} 
+0

Как вставить результат сортировки say в TreeSet, который позволяет сопоставлять только объекты – Dinushan

+0

Вы можете сделать это, создав дерево с помощью компаратора, а затем добавив все элементы в TreeSet. Пожалуйста, обратитесь к моему обновленному ответу за то же самое. –

+0

Thanks.I был путать с синтаксисом C++ для пользовательских компараторов – Dinushan

0

Самый простой способ сделать что-то, как это будет работать для любых классов, которые не являются сопоставимыми. То, как вы делаете это, создавая свой собственный метод сравнения, вы можете сделать это таким образом, как:

public static int compareJSONObjects(JSONObject obj1, JSONObject obj2){ 
    if(obj1.getField()>obj2.getField()){ 
     return 1; 
    }else{ 
     return -1; 
    } 
} 

теперь, когда вы звоните list.sort() вы можете создать свой собственный компаратор, как это:

list.sort((obj1, obj2) -> compareJSONObject(obj1, obj2)); 

делая это, вы сократить количество линий, необходимых, так как вся эта вещь может быть сокращен до 1 строки с помощью ternary и делать:

list.sort((obj1, obj2) -> obj1.getField()>obj2.getField() ? 1 : -1);