我有一個 JSONArray 如下,
JSONArray dataArray = new JSONArray();
dataArray = [
{
"name": "name1",
"row": 1,
"value": 20
},
{
"name": "name2",
"row": 1,
"value": 10
},
{
"name": "name3",
"row": 2,
"value": 10
},
{
"name": "name4",
"row": 3,
"value": 30
},
{
"name": "name5",
"row": 3,
"value": 10
}
]
我需要比較row屬性,如果相同,需要比較value屬性并對陣列中的物件進行排序。
嘗試使用 Java 比較器,但無法使其作業。有人可以幫忙嗎?
for(int i = 0; i < dataArray.size(); i ) {
elementList.add((JSONObject) dataArray.get(i));
}
Long row1 = null;
for (JSONObject obj : elementList) {
if(row1 == null) {
row1 = (Long) ((JSONObject) obj.get("row"));
}
else {
Long row2 = (Long) ((JSONObject) obj.get("row"));
if(row2 == row1) {
//call the comparator, but how to pass two objects?
}
row1 = row2;
}
}
uj5u.com熱心網友回復:
擴展此答案以匹配您的場景很容易
但不是
return valA.compareTo(valB);
你應該做
int comp = valA.compareTo(valB);
if (comp == 0){
String valC = (String) a.get(KEY_NAME2);
String valD = (String) b.get(KEY_NAME2);
return valC.compareTo(valD);
} else {
return comp;
}
所以應該是下面這樣。
JSONArray sortedJsonArray = new JSONArray();
List<JSONObject> jsonValues = new ArrayList<JSONObject>();
for (int i = 0; i < dataArray.length(); i ) { // <---- dataArray is the input that you have
jsonValues.add(dataArray.getJSONObject(i));
}
Collections.sort( jsonValues, new Comparator<JSONObject>() {
//You can change "Name" with "ID" if you want to sort by ID
private static final String KEY_NAME1 = "row";
private static final String KEY_NAME2 = "value";
@Override
public int compare(JSONObject a, JSONObject b) {
String valA = new String();
String valB = new String();
try {
valA = (String) a.get(KEY_NAME1);
valB = (String) b.get(KEY_NAME1);
}
catch (JSONException e) {
//do something
}
int comp = valA.compareTo(valB);
if (comp == 0){
String valC = (String) a.get(KEY_NAME2);
String valD = (String) b.get(KEY_NAME2);
return valC.compareTo(valD);
} else {
return comp;
}
}
});
編輯:更改為KEY_NAME1 = "row";以匹配新的問題要求
uj5u.com熱心網友回復:
這里有一個更簡單的方法:
您可以List<YourObject>使用 Jackson's將您的 JSON 字串轉換為ObjectMapper
List<YourObject> list = objectMapper.readValue(json, new TypeReference<List<YourObject>>(){});
然后使用Collections.sort andComparator對這個串列進行排序。您還可以Comparator根據您的情況實作自定義以按多個屬性對串列進行排序。
list.sort(Comparator.comparing(YourObject::getRow)
.thenComparing(YourObject::getValue));
uj5u.com熱心網友回復:
假設您將 json 資料反序列化為物件,例如
public class DataRow {
private String name;
private int row;
private int value;
// Getter, Setter, Constructor what ever needed
}
然后您可以使用串列和流,例如:
List<DataRow> datarows = //... read data from json
List<DataRow> sorted = datarows.stream()
.sorted(Comparator.comparing(DataRow::getRow).thenComparingInt(DataRow::getValue)).toList();
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/466527.html
上一篇:將字串連接到Java流的所有元素
