是否可以在不扩展库类的情况下使库类具有可比性?
import org.json.JSONObject;
LinkedList<JSONObject> list = getListFromFunction();
TreeSet<JSONObject> treeSet = new TreeSet<JSONObject>(list);
由于TreeSet
无法比较,因此无法在此处JSONObject
。我怎样才能&#34;附加&#34; JSONObject
的自定义比较器?(有一个独特的属性,比如&#34; _some_id&#34;要与之比较)
答案 0 :(得分:4)
我们可以在这种情况下使用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);
}
}
答案 1 :(得分: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) );
这样做可以减少所需的行数,因为使用ternary并执行以下操作可以将整个行缩短为1行:
list.sort( (obj1, obj2) -> obj1.getField()>obj2.getField() ? 1 : -1 );