Java - сделать библиотечный класс сопоставимым

Можно ли сделать библиотечные классы сопоставимыми, не расширяя их?

import org.json.JSONObject;

LinkedList<JSONObject> list = getListFromFunction();

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

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

2 ответа

Решение

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

Основной класс

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);
    }
}

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

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 строки, используя троицу и выполнив:

list.sort( (obj1, obj2) -> obj1.getField()>obj2.getField() ? 1 : -1 );
Другие вопросы по тегам