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 + "]";
}
}
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
}
}
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}}
我去 卡了一下。。。结果就提交了这么多。。。。。还有 里面是ID吧,你怎么用name