2 sekift sekift 于 2016.05.12 16:37 提问

怎么优化下面这个需求

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个回答

wangmanjie
wangmanjie   2016.05.12 18:31

我去 卡了一下。。。结果就提交了这么多。。。。。还有 里面是ID吧,你怎么用name

sekift
sekift 感谢分享,我试试。是name,一个name代表一个类别(人),按类别分类。
一年多之前 回复
wangmanjie
wangmanjie   2016.05.12 17: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

    }

wangmanjie
wangmanjie   2016.05.12 18:29

private static Map> getMyMap(List result) {
Map> dataMap = new HashMap>();

    for (PersonTest vo : result) {
        if (null != vo) {
            Map<String, Object> nameMap = new HashMap<String, Object>();
            if(!dataMap.containsKey(vo.getName())){
                nameMap.put( "id",vo.getId());
                nameMap.put("age",vo.getAge());
                dataMap.put(vo.getName(),nameMap);
            }else{
                int age=(int)dataMap.get(vo.getName()).get("age");
                int max=vo.getAge()>age?vo.getAge():age;

                String ids=dataMap.get(vo.getName()).get("id").toString();
                nameMap.put( "id",ids+ ","+vo.getId());
                nameMap.put("age",max);
                dataMap.put(vo.getName(),nameMap);
            }

        }
    }

    return dataMap;
}

out::::::{four={id=4, age=100}, one={id=1,3, age=3}, two={id=2, age=2}, five={id=5, age=10}}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!