面试题求解答

朝霞清辉 2020-08-06 11:55:53
@Data
class Key {
private String k;
private List<Key> list;
}
public class Test {
public static void main(String[] args) {
List<String> strList = Arrays.asList(
"信息部,IT组,张三",
"信息部,IT组,李四",
"信息部,运维组,王五",
"科技部,研发组,赵六");
List<Key> list = new ArrayList<>();

// TODO 请填写此处代码

System.out.println(JSON.toJSONString(list));
}
}

要求如下

引用
输出结果(为了方便区分结构,我们对JSON串进行了换行):

[
{
"k": "信息部",
"list": [
{
"k": "IT组",
"list": [
{
"k": "张三"
},
{
"k": "李四"
}
]
},
{
"k": "运维组",
"list": [
{
"k": "王五"
}
]
}
]
},
{
"k": "科技部",
"list": [
{
"k": "研发组",
"list": [
{
"k": "赵六"
}
]
}
]
}
]
...全文
530 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2020-08-06
  • 打赏
  • 举报
回复
简单的for循环就可以了

public class Test {
public static void main(String[] args) {
List<String> strList = Arrays.asList(
"信息部,IT组,张三",
"信息部,IT组,李四",
"信息部,运维组,王五",
"科技部,研发组,赵六");
List<Key> list = new ArrayList<>();

// TODO 请填写此处代码
for (String s : strList) { //字符串list循环
String[] arr = s.split(","); //字符串分割
List<Key> ll = list;
for (int i=0; i<arr.length; i++) { //分别判断分割后的字符串在结果list的k是否存在
Key key = null;
for (Key k : ll) {
if (arr[i].equals(k.getK())) {
key = k;
break;
}
}
if (key == null) { //如果不存在,new一个Key放到结果list里
key = new Key();
key.setK(arr[i]);
ll.add(key);
for (int j=i+1; j<arr.length; j++) { //其实主要就是循环生成list
ll = new ArrayList<>();
key.setList(ll);
key = new Key();
key.setK(arr[j]);
ll.add(key);
}
break;
}
ll = key.getList(); //如果存在,继续判断key.list里是否存在下一个分割的字符串
if (ll == null) {
ll = new ArrayList<>();
key.setList(ll);
}
}
}

System.out.println(JSON.toJSONString(list));
}
}
朝霞清辉 2020-08-06
  • 打赏
  • 举报
回复
引用 1 楼 ITjavaman 的回复:

public static void main(String[] args) {
List<String> strList = Arrays.asList(
"信息部,IT组,张三",
"信息部,IT组,李四",
"信息部,运维组,王五",
"科技部,研发组,赵六");
List<Key> list = new ArrayList<>();

// TODO 请填写此处代码
String[] split = null;
for(String str:strList){
split = str.split(",");
f(0,split,list);
}
System.out.println(JSON.toJSONString(list));
}

private static void f(int i,String [] split,List<Key> list){
Key key = null;
if(i==split.length){
key = getKey(split[i-1], list);
if(null != key){
key.setList(null);
}
return;
}
if(null == list){
list = new ArrayList<>();
}
key = getKey(split[i], list);
if(null == key){
key = new Key();
key.setK(split[i]);
key.setList(new ArrayList<>());
list.add(key);
}
f(i+1,split,key.getList());
}

private static Key getKey(String keyStr,List<Key> list){
for (int i=0;i<list.size();i++){
if(list.get(i).getK().equals(keyStr)){
return list.get(i);
}
}
return null;
}
谢谢
ITjavaman 2020-08-06
  • 打赏
  • 举报
回复

    public static void main(String[] args) {
        List<String> strList = Arrays.asList(
                "信息部,IT组,张三",
                "信息部,IT组,李四",
                "信息部,运维组,王五",
                "科技部,研发组,赵六");
        List<Key> list = new ArrayList<>();

        // TODO 请填写此处代码
        String[] split = null;
        for(String str:strList){
            split = str.split(",");
            f(0,split,list);
        }
        System.out.println(JSON.toJSONString(list));
    }

    private static void f(int i,String [] split,List<Key> list){
        Key key = null;
        if(i==split.length){
            key = getKey(split[i-1], list);
            if(null != key){
                key.setList(null);
            }
            return;
        }
        if(null == list){
            list = new ArrayList<>();
        }
        key = getKey(split[i], list);
        if(null == key){
            key = new Key();
            key.setK(split[i]);
            key.setList(new ArrayList<>());
            list.add(key);
        }
        f(i+1,split,key.getList());
    }

    private static Key getKey(String keyStr,List<Key> list){
        for (int i=0;i<list.size();i++){
            if(list.get(i).getK().equals(keyStr)){
                return list.get(i);
            }
        }
        return null;
    }
于2024年4月-2025年9月期间,研究团队在贵州习水国家级自然保护区制定39条样线,涵盖灌木林、常绿阔叶林、针叶林、常绿落叶阔叶混交林、针阔混交林等不同植被类型,每条样线分春夏秋冬4个季节采集样品,用真菌采集软件记录经纬度、海拔、采集地点、时间、生境等信息,使用佳能相机(R6 mark Ⅱ)对大型真菌进行拍照,并采集标本,标本存放于贵州省生物研究所大型真菌标本馆(HGAMF)。 通过形态学初步鉴定,结合分子生物学最终鉴定,参考已]报道的中国毒蘑菇名录开展毒蘑菇的认定。 调查到保护区内有毒真菌7目25科64种,导致中毒的主要类型有急性肾衰竭型、神经精神型和胃肠炎型。最终形成贵州习水国家级自然保护区大型有毒真菌图片数据集,它由以下2个部分组成。 (1)附件1包含78张原始照片(.JPG),照片名字包括了大型有毒真菌的拉丁名和中文名,若无中文名的直接用拉丁名。 (2)附件2是一个压缩文件,包含了2张工作表,其中一张表是大型有毒真菌39条样线的信息,另一张表是大型有毒真菌的中毒类型。 照片采用佳能相机R6 mark Ⅱ拍摄,物种鉴定通过多种文献核实,并经两位以上专家鉴定确认。该数据集可为研究地及周边的普通人识别有毒大型真菌提供参考,通过及时的图片对比,能有效避免误采误食大型有毒真菌,同时为因误食大型真菌可能引发的身体损伤进行了总结,能为患者及时治疗提供参考。

62,622

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧