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
    
        }
    

    评论

报告相同问题?

悬赏问题

  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀