Java - 使库 class 具有可比性
Java - Make a library class comparable
是否可以在不扩展库的情况下使库 类 具有可比性?
import org.json.JSONObject;
LinkedList<JSONObject> list = getListFromFunction();
TreeSet<JSONObject> treeSet = new TreeSet<JSONObject>(list);
在这里做一个TreeSet
是不可能的,因为JSONObject
没有可比性。我怎样才能 "attach" 一个自定义比较器到 JSONObject
?
(有一个独特的 属性,说“_some_id”来比较)
我们可以在这种情况下使用 Comparator 来处理这种情况。请参考下面的例子。
主要Class
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) );
这样做可以减少所需的行数,因为使用 ternary 并执行以下操作可以将整个事情缩短为 1 行:
list.sort( (obj1, obj2) -> obj1.getField()>obj2.getField() ? 1 : -1 );
是否可以在不扩展库的情况下使库 类 具有可比性?
import org.json.JSONObject;
LinkedList<JSONObject> list = getListFromFunction();
TreeSet<JSONObject> treeSet = new TreeSet<JSONObject>(list);
在这里做一个TreeSet
是不可能的,因为JSONObject
没有可比性。我怎样才能 "attach" 一个自定义比较器到 JSONObject
?
(有一个独特的 属性,说“_some_id”来比较)
我们可以在这种情况下使用 Comparator 来处理这种情况。请参考下面的例子。
主要Class
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) );
这样做可以减少所需的行数,因为使用 ternary 并执行以下操作可以将整个事情缩短为 1 行:
list.sort( (obj1, obj2) -> obj1.getField()>obj2.getField() ? 1 : -1 );