sekift 2016-05-12 08:37 采纳率: 0%
浏览 1194

怎么优化下面这个需求

package Demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class ABTest {

/**
 * 原数据List<PersonTest>:[PersonTest [id=1,name=one,age=1], PersonTest [id=2,name=two,age=2], 
 * PersonTest [id=3,name=one,age=3], PersonTest [id=4,name=four,age=100], 
 * PersonTest [id=5,name=five,age=10]]
 * 
 * 结果Map<String, Map<String, Object>>:{two={name=2, age=2}, five={name=5, age=10}, 
 * one={name=1,3, age=3}, four={name=4, age=100}}
 * 
 * 需求:按name分类,然后找出name中全部的id和最大的age。
 * 我的思想:先找出不同的name,然后再同时找同name的全部id和最大的age。
 * 怎么优化方法1和方法2?
 */
//方法1
private static Map<String, Map<String, Object>> getMap(List<PersonTest> result) {
    Map<String, Map<String, Object>> dataMap = new HashMap<String, Map<String, Object>>();
    Set<String> nameSet = new HashSet<String>();
    Map<String, Object> nameMap = new HashMap<String, Object>();
    // 一次取不同 的key
    for (PersonTest vo : result) {
        if (null != vo) {
            nameSet.add(vo.getName());
        }
    }
    // 二次取不同name
    for (String name : nameSet) {
        nameMap = getNameMap(name, result);
        dataMap.put(name, nameMap);
    }
    return dataMap;
}

//方法2
private static Map<String, Object> getNameMap(String name, List<PersonTest> result) {
    Map<String, Object> nameMap = new HashMap<String, Object>();
    List<Integer> levelList = new ArrayList<Integer>();
    StringBuilder sb = new StringBuilder();
    for (PersonTest vo : result) {
        if (vo.getName().equals(name)) {
            sb.append("," + vo.getId());
            levelList.add(vo.getAge());
        }
    }
    nameMap.put("age", Collections.max(levelList));
    nameMap.put("name", sb.toString().substring(1));
    return nameMap;
}

public static void main(String[] args) {
    List<PersonTest> list = new ArrayList<PersonTest>();
    PersonTest p1 = new PersonTest();
    p1.setId(1);
    p1.setName("one");
    p1.setAge(1);
    PersonTest p2 = new PersonTest();
    p2.setId(2);
    p2.setName("two");
    p2.setAge(2);
    PersonTest p3 = new PersonTest();
    p3.setId(3);
    p3.setName("one");
    p3.setAge(3);
    PersonTest p4 = new PersonTest();
    p4.setId(4);
    p4.setName("four");
    p4.setAge(100);
    PersonTest p5 = new PersonTest();
    p5.setId(5);
    p5.setName("five");
    p5.setAge(10);
    list.add(p1);
    list.add(p2);
    list.add(p3);
    list.add(p4);
    list.add(p5);

    System.out.println("list::::::" + list);
    System.out.println("out::::::" + getMap(list));

}

}

class PersonTest {
private int id;
private String name;
private int age;

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

@Override
public String toString() {
    return "PersonTest [id=" + id + ",name=" + name + ",age=" + age + "]";
}

}

  • 写回答

3条回答 默认 最新

  • -缘故- 2016-05-12 09:45
    关注

    for( vo:result)

    if(datemap 包含 vo.getname)//datemap是返回的结果

    获取vo的age与datemap[vo.getname].getage比较 得到较大值AGE
    将datemap[vo.getname].getId+","+vo.getId 保存到字符串IDS
    将>put 到datemap

        }else{
                直接将<vo.getname,<vo.getid,vo.getage>>put到datemap
    
        }
    

    评论

报告相同问题?

悬赏问题

  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R
  • ¥15 在线请求openmv与pixhawk 实现实时目标跟踪的具体通讯方法
  • ¥15 八路抢答器设计出现故障
  • ¥15 opencv 无法读取视频
  • ¥15 按键修改电子时钟,C51单片机
  • ¥60 Java中实现如何实现张量类,并用于图像处理(不运用其他科学计算库和图像处理库))
  • ¥20 5037端口被adb自己占了
  • ¥15 python:excel数据写入多个对应word文档