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