Rumah > Soal Jawab > teks badan
Kini ada SENARAI:
[
{
"type":"呼吸系统",
"illness":"肺气肿",
"quotaName": "血压"
},
{
"type":"呼吸系统",
"illness":"肺气肿",
"quotaName": "血常规"
},
{
"type":"呼吸系统",
"illness":"哮喘",
"quotaName": "血常规"
},
{
"type":"循环系统",
"illness":"高血压",
"quotaName": "心电图"
},
{
"type":"循环系统",
"illness":"高血压",
"quotaName": "心电彩超"
}
]
Senarai yang saya nak:
[
{
"type":"呼吸系统",
"illnessList":[
{
"name":"肺气肿",
"quotaList":[
{
"name":"血压"
},
{
"name":"血常规"
}
]
},
{
"name":"哮喘",
"quotaList":[
{
"name":"血常规"
}
]
}
]
},
{
"type":"循环系统",
"illnessList":[
{
"name":"高血压",
"quotaList":[
{
"name":"心电图"
},
{
"name":"心电彩超"
}
]
}
]
}
]
Senarai asal, semua sistem penyakit, penyakit, dan penunjuk pengesanan penyakit digabungkan
Saya ingin mendapatkan senarai berdasarkan klasifikasi jenis, tetapi saya masih tidak dapat mencari idea itu
Gelung, setelah melintasinya berkali-kali, saya rasa kepala saya bercelaru
女神的闺蜜爱上我2017-06-28 09:26:41
Mengikut keperluan input dan output penyoal, mulakan sahaja dengan satuJSONArray
转换到另一个JSONArray
...感觉输出的JSONArray无非是按照了两个属性进行了归类,其实结构应该类似于Map<String,Map<String,List<String>>
,所以我的想法就是把输入的JSONArray
要转化为Map<String, Map<String,List<String>>
的结构即可...而看到我刚才说的按照属性归类...那...很显然...噔噔噔!!!...心中自然浮现了Java8的Collectors.groupingBy
...直接无脑groupingBy
Berikut ialah idea dan kod kecil saya:
Memandangkan ia berorientasikan objek, saya mula-mula mencipta objek Bo inputFromDataBo
@Getter
@Setter
public class FromDataBo {
private String type;
private String illness;
private String quotaName;
}
Kemudian terdapat objek output yang dicipta mengikut format outputToDataBo
(Anda boleh mengabaikan kaedah beranotasi dahulu...ia hanya untuk penukaran, anda boleh melihat struktur data dahulu)
@Getter
@Setter
public class ToDataBo {
private String type;
private List<ToDataIllnessBo> illnessList;
/**
* map转化为List<ToDataBo>
* @param map
* @return
*/
public static List<ToDataBo> createByMap(Map<String, Map<String, List<String>>> map){
return map.entrySet().stream().map(ToDataBo::of).collect(Collectors.toList());
}
/**
* 一个Map.Entry<String, Map<String, List<String>>>对应转化为一个ToDataBo
* @param entry
* @return
*/
public static ToDataBo of(Map.Entry<String, Map<String, List<String>>> entry){
ToDataBo dataBo = new ToDataBo();
dataBo.setType(entry.getKey());
dataBo.setIllnessList(entry.getValue().entrySet().stream().map(ToDataIllnessBo::of).collect(Collectors.toList()));
return dataBo;
}
@Getter
@Setter
static class ToDataIllnessBo{
private String name;
private List<ToDataQuotaBo> quotaList;
/**
* 一个Map.Entry<String, List<String>>对应转化为一个ToDataIllnessBo
* @param entry
* @return
*/
public static ToDataIllnessBo of(Map.Entry<String, List<String>> entry){
ToDataIllnessBo dataIllnessBo = new ToDataIllnessBo();
dataIllnessBo.setName(entry.getKey());
dataIllnessBo.setQuotaList(entry.getValue().stream().map(ToDataQuotaBo::new).collect(Collectors.toList()));
return dataIllnessBo;
}
}
@Getter
@Setter
@AllArgsConstructor
static class ToDataQuotaBo {
private String name;
}
}
Sekarang objek input dan output sudah tersedia, kita boleh mengklasifikasikan atribut yang paling penting mengikut atribut, saya akan melihat anggaran penukaran menjadi Map<String,Map<String,List<String>>
的代码贴出来...主要就是这个嘛...注释嘛,熟悉lamdba
sepintas lalu... Jika anda tidak biasa dengannya, ketahui lebih lanjut. mengenainya
Map<String, Map<String, List<String>>> collect = fromDataBos.stream().collect(
// 按照type分类
Collectors.groupingBy(FromDataBo::getType,
// 按照type分类后,同一类的数据再按照illness分类
Collectors.groupingBy(FromDataBo::getIllness,
// 按照type分类,再按照illness分类后,同一类的数据取其中的QuotaName并转化为集合
Collectors.mapping(FromDataBo::getQuotaName, Collectors.toList()))));
Pada penghujungnya ialah kod ujian lengkap dan keputusan, yang terakhir result
对象就是你需要的输出JSONArray
public class Test1 {
public static void main(String[] args) {
String from = "[\n" +
" {\n" +
" \"type\":\"呼吸系统\",\n" +
" \"illness\":\"肺气肿\",\n" +
" \"quotaName\": \"血压\"\n" +
" },\n" +
" {\n" +
" \"type\":\"呼吸系统\",\n" +
" \"illness\":\"肺气肿\",\n" +
" \"quotaName\": \"血常规\"\n" +
" },\n" +
" {\n" +
" \"type\":\"呼吸系统\",\n" +
" \"illness\":\"哮喘\",\n" +
" \"quotaName\": \"血常规\"\n" +
" },\n" +
" {\n" +
" \"type\":\"循环系统\",\n" +
" \"illness\":\"高血压\",\n" +
" \"quotaName\": \"心电图\"\n" +
" },\n" +
" {\n" +
" \"type\":\"循环系统\",\n" +
" \"illness\":\"高血压\",\n" +
" \"quotaName\": \"心电彩超\"\n" +
" }\n" +
" ]";
// 把输入的JSONArray字符串转化为FromDataBo集合
List<FromDataBo> fromDataBos = JSONArray.parseArray(from, FromDataBo.class);
// 归类
Map<String, Map<String, List<String>>> collect = fromDataBos.stream().collect(
// 按照type分类
Collectors.groupingBy(FromDataBo::getType,
// 按照type分类后,同一类的数据再按照illness分类
Collectors.groupingBy(FromDataBo::getIllness,
// 按照type分类,再按照illness分类后,同一类的数据取其中的QuotaName并转化为集合
Collectors.mapping(FromDataBo::getQuotaName, Collectors.toList()))));
// 归类后的map转化为输出对象ToDataBo集合
List<ToDataBo> toDataBos = ToDataBo.createByMap(collect);
// 我是输出对象,我在这
JSONArray result = JSONArray.parseArray(JSONArray.toJSONString(toDataBos));
System.out.println(result);
}
}
Keputusan ujian:
Sama-sama...
滿天的星座2017-06-28 09:26:41
Bukankah ini ludah keluar dari bahagian belakang? Anda tidak perlu mengendalikannya, beritahu sahaja bahagian belakang. Atau anda boleh menggunakan apa yang mereka ludahkan untuk mencapai kesan anda.
Hanya anda ingin menyelamatkan masalah. Proses terus dalam gelung.
Gunakan tatasusunan di atas dan lakukan pemprosesan dalam gelung, yang sama seperti apa yang anda proses kemudian. Tidak sebaik pra-pemprosesan. Prestasi tinggi. Berikut ialah gaya standard.
Antaramuka disiarkan.
欧阳克2017-06-28 09:26:41
Alamat kod
http://jsbin.com/roqejoficu/e...
var convertData = function(data){
let result = [];
var level1Obj = {};
var level2Obj = {};
var level3Obj = {};
data.forEach(function (item, index, arr) {
//一层对象
level1Obj[item.type] = {};
level1Obj[item.type]["type"] = item.type;
//2层对象
level2Obj[item.type+item.illness] = {};
level2Obj[item.type+item.illness]["p1"] = item.type;
level2Obj[item.type+item.illness]["type"] = item.illness;
//3层对象
level3Obj[index] = {};
level3Obj[index]["p1"] = item.type;
level3Obj[index]["p2"] = item.illness;
level3Obj[index]["type"] = item.quotaName;
});
for (var level1 in level1Obj) {
var o1 = {};
o1.type = level1Obj[level1].type;
o1.list = [];
result.push(o1);
for (var level2 in level2Obj) {
if (level2Obj[level2].p1 == level1Obj[level1].type) {
var o2 = {};
o2.type = level2Obj[level2].type;
o2.list = [];
o1.list.push(o2);
for (var level3 in level3Obj) {
if (level3Obj[level3].p1 == level1Obj[level1].type && level3Obj[level3].p2 == level2Obj[level2].type) {
var o3 = {};
o3.type = level3Obj[level3].type;
o2.list.push(o3);
}
}
}
}
}
console.log(result);
return result;
},
var result = convertData(data);
Penulisan tidak bagus jika ada kaedah yang lebih baik, saya harap dapat dikongsikan